C语言中经socket接收数据的相关函数详解
recv()函数: #include <sys/types.h> #include <sys/socket.h> 定义函数: int recv(int s,void *buf,int len,unsigned int flags); 函数说明:recv()用来接收远端主机经指定的socket 传来的数据,并把数据存到由参数buf 指向的内存空间,参数len 为可接收数据的最大长度. 参数 flags 一般设0. 其他数值定义如下: 错误代码: recvfrom()函数: #include <sys/types.h> #include <sys/socket.h> 定义函数: int recvfrom(int s,unsigned int flags,struct sockaddr *from,int *fromlen); 函数说明:recv()用来接收远程主机经指定的socket 传来的数据,参数len 为可接收数据的最大长度. 参数flags 一般设0,其他数值定义请参考recv(). 参数from 用来指定欲传送的网络地址,结构sockaddr 请参考bind(). 参数fromlen 为sockaddr 的结构长度. 返回值:成功则返回接收到的字符数,失败则返回-1,错误原因存于errno 中. 错误代码: 范例: #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/typs.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 2345 #define SERVER_IP "127.0.0.1" main() { int s,len; struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in); char buffer[256]; //建立socket if((s = socket(AF_INET,SOCK_DGRAM,0)) < 0) { perror("socket"); exit(1); } //填写sockaddr_in bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = inet_addr(SERVER_IP); while(1) { bzero(buffer,sizeof(buffer)); //从标准输入设备取得字符串 len = read(STDIN_FILENO,buffer,sizeof(buffer)); //将字符串传送给server 端 sendto(s,len,&addr,addr_len); //接收server 端返回的字符串 len = recvfrom(s,sizeof(buffer),&addr_len); printf("receive: %s",buffer); } } 执行(先执行udp server 再执行udp client): hello //从键盘输入字符串 receive: hello //server 端返回来的字符串 recvmsg()函数: #include <sys/types.h> #include <sys/socktet.h> 定义函数: int recvmsg(int s,struct msghdr *msg,unsigned int flags); 函数说明:recvmsg()用来接收远程主机经指定的socket 传来的数据. 参数s 为已建立好连线的socket,如果利用UDP 协议则不需经过连线操作. 参数msg 指向欲连线的数据结构内容,参数flags 一般设0,详细描述请参考send(). 关于结构msghdr 的定义请参考sendmsg(). 返回值:成功则返回接收到的字符数,错误原因存于errno 中. 错误代码: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |