recvfromUDP中recvfrom函数为什么不阻塞

recvfrom  时间:2021-07-16  阅读:()

recvfrom函数得到的IP地址为什么不对?

while(1) { recvfrom(sockfd, readbuff, UDP_CMD_BUFF_LENGTH - 1, 0, (struct sockaddr *)&Glob_remot_88_port_add, &len); PRINT("[recevudp]len %d IP is %s ", len, _ntoa(Glob_remot_88_port_add.sin_addr)); } 这个函数, 第一次接受打印出的发送方IP地址总是0.0.0.0; 解决方法: 在recvfrom之前加一句: len = sizeof(struct sockaddr); 即可

recv()和recvfrom()有什么区别?

recv的recvfrom是可以替换使用的,只是recvfrom多了两个参数,可以用来接收对端的地址信息,这个对于udp这种无连接的,可以很方便地进行回复。

而换过来如果你在udp当中也使用recv,那么就不知道该回复给谁了,如果你不需要回复的话,也是可以使用的。

另外就是对于tcp是已经知道对端的,就没必要每次接收还多收一个地址,没有意义,要取地址信息,在ept当中取得就可以加以记录了。

recvfrom()的一次调用只能返回一个UDP包。此种说法正确吗?

1.一次recvfrom()调用只能返回一个UDP数据包。

2.send()函数参数中的buffer长度有限制,此长度限制取决于底层协议的数据包最大长度,这个长度可以通过getsockopt函数设置SO_MAX_MSG_SIZE参数获得,如果发送的数据包超过底层协议的最大长度则返回WSAEMSGSIZE错误,同时不发送任何数据。

sendto()函数参数中的buffer长度也有限制,这个限制更明显一些,数据包的数据部分(不包括数据头)的长度不能超过512字节。

3.send()与sendto()正常返回均不能保证发送的数据被接受方正确接收,还要看缓冲区是否已满。

当缓冲区为空时,recv与recvfrom均阻塞等待(除非设置为非阻塞,此时将返回WSAEWOULDBLOCK错误),因此只要socket正常连接,且缓冲区有数据内容,recv与recvfrom函数虽延迟但均能正常接收数据包。

希望我的回答你能满意:) 你好,我看了你添加的内容,我上面所说的最大长度512字节是指UDP数据包可以发送的的最大长度,针对的是sendto函数,而你测试时使用的则是TCP连接中的send函数,两者使用的协议不同,因此缓冲区的长度当然不同了,我使用getsockopt测试,得到我本机接受方的最大缓冲为8192字节,测试代码如下: #include <stdio.h> #include "winsock2.h" void main() { WSADATA wsaData; SOCKET ListenSocket; sockaddr_in service; int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); if( iResult != NO_ERROR ) printf("Error at WSAStartup "); ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if (ListenSocket == INVALID_SOCKET) { printf("Error at socket() "); WSACleanup(); return; } hostent* thisHost; char* ip; u_short port; port = 27015; thisHost = gethostbyname(""); ip = _ntoa (*(struct in_addr *)*thisHost->h_addr_list); service.sin_family = AF_INET; service.sin_addr.s_addr = _addr(ip); service.sin_port = htons(port); if ( bind( ListenSocket,(SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) { printf("bind failed "); closesocket(ListenSocket); return; } int optVal; int optLen = sizeof(int); getsockopt(ListenSocket, SOL_SOCKET, SO_RCVBUF, (char*)&optVal, &optLen); printf("The max length is %d ", optVal); WSACleanup(); return; } 在此补充一下,上面所说SO_MAX_MSG_SIZE只针对UDP这种数据报形式的协议有效,而对于基于流的TCP/IP无效,因此在此使用SO_RCVBUF参数,如果还有问题敬请指出:)

UDP编程中client和server中使用recvfrom和sendto的区别

client中: sendto(sfd,buf,strlen(buf),0,(struct sockaddr *)&saddr,len); recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL); server中: recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr *)&caddr,&len); 将网络字节序的IP地址转换成字符串输出 // _ntoa : struct ip -> char *ip char *paddr = NULL; paddr = _ntoa(caddr.sin_addr); printf("client[%s] say:%s ",paddr,buf); sendto(fd,buf,strlen(buf),0,(struct sockaddr *)&caddr,len); struct sockaddr_in saddr; socklen_t len = sizeof(saddr); sendto最后两个参数是(struct sockaddr *)&saddr【 saddr 是自己 新建的sockaddr_in型的变量】, len【len 是socklen_t型的变量 其值为sizeof(saddr)】在client和server的编程中相似。

recvfrom 在client编程中,最后两个参数应设置为空。

但在server编程时,recvfrom的最后两个参数是(struct sockeaddr *)&caddr和&len。

通过_ntoa可以将网络字节序的地址转换为字符串型的,这样可增强应用性能,比如:打印。

recvfrom为什么接收不到数据

检查,接收socket有没有绑定端口,绑定的哪个端口,这个端口,是不是客户端发送指定的端口相同。

其次,检查发送的socket所发送到的地址是不是正确的,端口是不是正确。

再次次,sendto是UDP的发送接口,UDP不提供有保证的服务(与TCP的不同)。

所以,在中国络状况差的环境下,UDP很有可能会丢包。

如果楼主要传输文件之类的数据,建议使用TCP,因为文件需要保证完整性,UDP可能会丢包。

保证不了。

当然,你也可以添加RTP协议辅助UDP来保证传输

UDP中recvfrom函数为什么不阻塞

没开服务器执行客户端recvfrom确实返回SOCKET_ERROR。

WSAGetLastError返回值10054(WSAECONNRESET )A existing connection was forcibly closed by the remote host. 看来sendto函数发送失败(IP地址无接收端口),导致recvfrom的失败。

数脉科技:六月优惠促销,免备案香港物理服务器,E3-1230v2处理器16G内存,350元/月

数脉科技六月优惠促销发布了!数脉科技对香港自营机房的香港服务器进行超低价促销,可选择30M、50M、100Mbps的优质bgp网络。更大带宽可在选购时选择同样享受优惠,目前仅提供HKBGP、阿里云产品,香港CN2、产品优惠码续费有效,仅限新购,每个客户可使用于一个订单。新客户可以立减400元,或者选择对应的机器用相应的优惠码,有需要的朋友可以尝试一下。点击进入:数脉科技官方网站地址数脉科技是一家成...

妮妮云(100元/月)阿里云香港BGP专线 2核 4G

妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款,超过2天不退款 物...

速云:深圳独立服务器,新品上线,深港mpls免费体验,多重活动!

速云怎么样?速云是一家国人商家。速云商家主要提供广州移动、深圳移动、广州茂名联通、香港HKT等VDS和独立服务器。目前,速云推出深圳独服优惠活动,机房为深圳移动机房,购买深圳服务器可享受5折优惠,目前独立服务器还支持申请免费试用,需要提交工单开通免费体验试用,次月可享受永久8折优惠,也是需工单申请哦!点击进入:速云官方网站地址活动期限至 2021年7月22日速云云服务器优惠活动:活动1:新购首月可...

recvfrom为你推荐
firstname英语中的first name 和last name具体指什么bloomfilter布隆过滤器既然有错误率,为什么还能应用在key-value系统中?查字网騳骉,怎样读?拼音tvos智能电视都什么功能被广电封杀了?jql建筑设计图纸上JQL 梁,是不是地下正负零基础梁?急急!flowplayer如何编译flowplayer源码微信论坛手机微信论坛如何实现layoutsubviews如何自定义UISearchBar?清除电脑垃圾怎么删除电脑垃圾?mediasRES代表什么意思
独立ip虚拟主机 国外域名 网站备案域名查询 景安vps dns是什么 主机 webhostingpad 圣迭戈 老左博客 gg广告 免空 空间论坛 有奖调查 最好的免费空间 135邮箱 91vps 789电视剧 web服务器是什么 重庆电信服务器托管 美国凤凰城 更多