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的失败。

FBICDN,0.1元解决伪墙/假墙攻击,超500 Gbps DDos 防御,每天免费流量高达100G,免费高防网站加速服务

最近很多网站都遭受到了伪墙/假墙攻击,导致网站流量大跌,间歇性打不开网站。这是一种新型的攻击方式,攻击者利用GWF规则漏洞,使用国内服务器绑定host的方式来触发GWF的自动过滤机制,造成GWF暂时性屏蔽你的网站和服务器IP(大概15分钟左右),使你的网站在国内无法打开,如果攻击请求不断,那么你的网站就会是一个一直无法正常访问的状态。常规解决办法:1,快速备案后使用国内服务器,2,使用国内免备案服...

香港2GB内存DIYVM2核(¥50月)香港沙田CN2云服务器

DiyVM 香港沙田机房,也是采用的CN2优化线路,目前也有入手且在使用中,我个人感觉如果中文业务需要用到的话虽然日本机房也是CN2,但是线路的稳定性不如香港机房,所以我们在这篇文章中亲测看看香港机房,然后对比之前看到的日本机房。香港机房的配置信息。CPU内存 硬盘带宽IP价格购买地址2核2G50G2M1¥50/月选择方案4核4G60G3M1¥100/月选择方案4核8G70G3M4¥200/月选择...

野草云99元/月 ,香港独立服务器 E3-1230v2 16G 30M 299元/月 香港云服务器 4核 8G

野草云月末准备了一些促销,主推独立服务器,也有部分云服务器,价格比较有性价比,佣金是10%循环,如果有时间请帮我们推推,感谢!公司名:LucidaCloud Limited官方网站:https://www.yecaoyun.com/香港独立服务器:CPU型号内存硬盘带宽价格购买地址E3-1230v216G240GB SSD或1TB 企盘30M299元/月点击购买E5-265016G240GB SS...

recvfrom为你推荐
ipad怎么分屏ipad分屏怎么用,ipad分屏使用方法在线课堂钉钉群直播和在线课堂的区别?arc是什么意思arctanx等于什么?php论坛怎样快速在个人电脑上建立一个自己的PHP论坛服务器?基础设施即服务基础设施是什么意思啊?mergecellsExcel 合并及计数宏 VBAalphablenddelphi中都有哪些控件有AlphaBlend属性,也就是可透明杭州营销型网站苏州网站推广有哪些?文件系统类型常见的文件类型有哪几种?文件系统类型windows 操作系统的文件系统具体有哪几种
北京虚拟主机 cn域名备案 新加坡服务器 rackspace omnis xen 免费ftp空间申请 100m免费空间 泉州移动 yundun 免费的asp空间 德讯 godaddy空间 腾讯数据库 好看的空间 中国电信宽带测速 tracker服务器 apachetomcat weblogic部署 blaze 更多