2015-01-17 13:40:24|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
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服务器,并得到了返回信息。