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的失败。
关于HostYun主机商在之前也有几次分享,这个前身是我们可能熟悉的小众的HostShare商家,主要就是提供廉价主机,那时候官方还声称选择这个品牌的机器不要用于正式生产项目,如今这个品牌重新转变成Hostyun。目前提供的VPS主机包括KVM和XEN架构,数据中心可选日本、韩国、香港和美国的多个地区机房,电信双程CN2 GIA线路,香港和日本机房,均为国内直连线路,访问质量不错。今天和大家分享下...
亚洲云Asiayun怎么样?亚洲云Asiayun好不好?亚洲云成立于2021年,隶属于上海玥悠悠云计算有限公司(Yyyisp),是一家新国人IDC商家,且正规持证IDC/ISP/CDN,商家主要提供数据中心基础服务、互联网业务解决方案,及专属服务器租用、云服务器、云虚拟主机、专属服务器托管、带宽租用等产品和服务。Asiayun提供源自大陆、香港、韩国和美国等地骨干级机房优质资源,包括B...
hostodo从2014年年底运作至今一直都是走低价促销侧率运作VPS,在市场上一直都是那种不温不火的品牌知名度,好在坚持了7年都还运作得好好的,站长觉得hostodo还是值得大家在买VPS的时候作为一个候选考虑项的。当前,hostodo有拉斯维加斯和迈阿密两个数据中心的VPS在促销,专门列出了2款VPS给8T流量/月,基于KVM虚拟+NVMe整列,年付送DirectAdmin授权(发ticket...
recvfrom为你推荐
showwindowvb ShowWindow 的使用方法 隐藏/显示 指定窗口 (完整代码)谢谢bindservice如何启动和停止用service拓扑关系什么是矢量数据、栅格数据、拓扑关系?备忘录模式手机如何设置备忘录提醒备忘录模式为什么我的华为手机界面总是有个框框在备忘录上面天融信防火墙如何使用天融信NGFW4000防火墙工具jqlDX5JQL8WDPMW求大神帮查下是不是行货苹果索引超出了数组界限索引超出了数组界限图片存储如何将图片保存下来优众网瑞达恒慧讯网是做什么的?
顶级域名 greengeeks 免费申请网页 百度云100as linkcloud idc测评网 vmsnap3 好玩的桌面 商家促销 商务主机 最好的空间 linux空间 河南移动邮件系统 php空间推荐 泉州电信 腾讯实名认证中心 腾讯总部在哪 宏讯 免费的asp空间 东莞服务器托管 更多