我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() 。
总结以上是内存溢出为你收集整理的设置UDP套接字的recv fcn超时全部内容,希望文章能够帮你解决设置UDP套接字的recv fcn超时所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)