当前位置: 技术问答>linux和unix
关于网络通信中recvfrom和sendto的用法
来源: 互联网 发布时间:2017-01-04
本文导语: 我在服务器里广播一条系统信息(buf3),然后接受客户端发来的信息(buf4),再转发给所有的客户;在客户端里接受服务器发来的信息并显示,发送信息给客户端。用UDP来实现。 服务器里: sendto(sockfd,...
我在服务器里广播一条系统信息(buf3),然后接受客户端发来的信息(buf4),再转发给所有的客户;在客户端里接受服务器发来的信息并显示,发送信息给客户端。用UDP来实现。
服务器里:
sendto(sockfd,buf3,sizeof(buf3),0,NULL,NULL);
printf("recv111111111n");
recvfrom(sockfd,buf4,MAXLINE,0,NULL,NULL);
// printf("recv333333n");
sendto(sockfd,buf4,sizeof(buf4),0,NULL,NULL);
客户端里:
recvfrom(sockfd,buf2,MAXLINE,0,NULL,NULL);
printf("recv from server:%sn",buf2);
sendto(sockfd,buf,sizeof(buf),0,(SA *)&servaddr,sizeof(servaddr));
问题:
recvfrom函数后两个参数应该为&peeraddr和&peerlen,用以保存接受到的数据的来源地址和地址大小,如果在客户端,设置为NULL,意为不保存服务器的地址,但是在服务器端也设置为NULL也可以吗?“ printf("recv111111111n");”这句输出,但是那句注释掉的 “printf("recv333333n");”没有输出,循环也卡在这里。
求教~
服务器里:
sendto(sockfd,buf3,sizeof(buf3),0,NULL,NULL);
printf("recv111111111n");
recvfrom(sockfd,buf4,MAXLINE,0,NULL,NULL);
// printf("recv333333n");
sendto(sockfd,buf4,sizeof(buf4),0,NULL,NULL);
客户端里:
recvfrom(sockfd,buf2,MAXLINE,0,NULL,NULL);
printf("recv from server:%sn",buf2);
sendto(sockfd,buf,sizeof(buf),0,(SA *)&servaddr,sizeof(servaddr));
问题:
recvfrom函数后两个参数应该为&peeraddr和&peerlen,用以保存接受到的数据的来源地址和地址大小,如果在客户端,设置为NULL,意为不保存服务器的地址,但是在服务器端也设置为NULL也可以吗?“ printf("recv111111111n");”这句输出,但是那句注释掉的 “printf("recv333333n");”没有输出,循环也卡在这里。
求教~
|
recvfrom默认是阻塞的,你可以把它设成非阻塞的,试试。设置方法见:http://topic.csdn.net/u/20110922/23/efea0a48-88e6-4f91-bdbc-7c7cad7e25c2.html
另外我有一个疑问,你的sendto的最后两个参数怎么是NULL的,不应该是目的IP吗?能解释一下吗?
另外我有一个疑问,你的sendto的最后两个参数怎么是NULL的,不应该是目的IP吗?能解释一下吗?
|
你的sendto失败了吧 ,你把要传送的网络地址设置为null了
|
这样是不行的,如果你想把数据发到整个网络,可以把目的IP设为组播地址(224开头的地址)。
我知道你为什么没有打印了,因为你的发送失败,所以你的客户端recvfrom接收不到数据,因此而阻塞。程序运行不到printf那一句。。。。。。。。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。