我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] 举报,一经查实,本站将立刻删除。