C/C++编程之socket基本函数的用法

2015-01-17 13:40:24|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 网络通信|来源:唯设编程网

7.数据接收函数

int recv (int sockfd, void *buf, int len, unsigned int flags);

返回:若成功则返回接收的字节数,失败则返回-1。

参数:sockfd为socket编号,buf用来接收数据,len表示数据长度,flags一般设为0。

使用端口号为21的FTP服务来测试数据接收函数。由于国内FTP服务器使用中文编码的问题,可能出现乱码,先用英文的FTP服务器进行测试。
在终端中输入如下指令:

ping ftp.gnu.org

结果为:

PING ftp.gnu.org (208.118.235.20) 56(84) bytes of data.
64 bytes from ftp.gnu.org (208.118.235.20): icmp_req=1 ttl=42 time=356 ms

说明ftp.gnu.org的IP地址为208.118.235.20,同时知道FTP默认端口为21,测试程序如recv_from_ftp.c所示:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <fcntl.h>
#include <sys/stat.h>
#define PORT 21
#define FTP "208.118.235.20"

int main()
{
    int sockfd;
    struct sockaddr_in addr;
    if( (sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0 )
    {
        perror("socket create error!");
        exit(1);
    }
    else
    {
        printf("socket create successfully!
");
        printf("socket id:%d
",sockfd);
    }

    bzero(&addr,sizeof(struct sockaddr_in));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(PORT);
    addr.sin_addr.s_addr=inet_addr(FTP);
    if ( connect(sockfd, (struct sockaddr*)(&addr), sizeof(struct sockaddr)) < 0 )
    {
        perror("connect error!");
        exit(1);
    }
    else
    {
        printf("connected successfully!
");
        printf("ftp server ip:%s
",FTP);
        printf("ftp transfer port:%d
",PORT);
    }
    char buf[1024];
    recv(sockfd,buf,sizeof(buf),0);
    printf("%s
",buf);
    return 0;
}

运行结果如下:
socket create successfully!
socket id:3
connected successfully!
ftp server ip:208.118.235.20
ftp transfer port:21
220 GNU FTP server ready.

程序表明成功连接到FTP服务器,并得到了返回信息。

发表评论0条 】
网友评论(共?条评论)..
C/C++编程之socket基本函数的用法