微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置UDP套接字的recv fcn超时

我sendto发送一个UDP数据包,然后通过recv接收到答案。如果recv没有收到答复,程序不会继续。 但是,udp数据包可能会丢失,或由于某种原因,数据包可能无法传递,以致程序卡住recv行。 我想知道如果nopacket到达,例如一分钟,如何设置recv的超时时间,然后跳过该行并继续执行代码

我不粘贴完整的代码,因为它是一个通用的udp代码,我的问题是唯一的recv 。 最后的说明,开发环境是linux。

unsigned long buf[maxlen]; struct protoent *proto; // struct sockaddr_in server_addr; int s; // socket memset( &server_addr,sizeof( server_addr )); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr = inet_addr(hostname); sendto(s,msg,sizeof(msg),(struct sockaddr *)&server_addr,sizeof(server_addr)); recv(s,buf,sizeof(buf),0);

实现自定义Windows身份validation包

Msys在Powershell中 – 没有这样的文件或目录

我们必须使用C“出于性能原因”

放弃在Windows上的权利

如何在OPENGL之上定位状态栏?

COM服务器作为Windows服务,不能传递数组作为函数参数

OpenCV错误:断言失败(a_size.width == len)

当应用程序崩溃时,如何处理Linux缓冲区caching?

使用GCC构buildLinux可执行文件

为什么Microsoft.Build.Evaluation在64位PC上将$(ProgramFiles)评估为“c: program files”?

您可以使用poll或select或类似的东西:

struct pollfd fd; int res; fd.fd = s; fd.events = POLLIN; res = poll(&fd,1,1000); // 1000 ms timeout if (res == 0) { // timeout } else if (res == -1) { // error } else { // implies (fd.revents & POLLIN) != 0 recv(s,0); // we can read ... }

如何在Linux中设置UDP套接字超时:

#include <sys/time.h> struct timeval timeout={2,0}; //set timeout for 2 seconds /* set receive UDP message timeout */ setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(struct timeval)); /* Receive UDP message */ int recvlen = recvfrom(fd,BUFSIZE,(struct sockaddr *)&remaddr,&slen); if (recvlen >= 0) { //Message Received } else{ //Message Receive Timeout or other error }

我想知道如何设置recv超时

使用SO_RCVTIMEO选项调用setsockopt() 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐