Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C UDP套接字设置超时_C_Sockets_Udp - Fatal编程技术网

C UDP套接字设置超时

C UDP套接字设置超时,c,sockets,udp,C,Sockets,Udp,我正在尝试在UDP套接字上设置100毫秒超时。我正在使用C。我已经在下面发布了我的相关代码。我不知道为什么这不是超时,而是在它没有收到段时挂起。这是否仅适用于未使用bind()方法绑定的套接字 #定义重新传输之间的超时时间_ms100/*秒*/ 如果((rcv_sock=socket(PF_INET,sock_DGRAM,IPPROTO_UDP))

我正在尝试在UDP套接字上设置100毫秒超时。我正在使用C。我已经在下面发布了我的相关代码。我不知道为什么这不是超时,而是在它没有收到段时挂起。这是否仅适用于未使用bind()方法绑定的套接字

#定义重新传输之间的超时时间_ms100/*秒*/
如果((rcv_sock=socket(PF_INET,sock_DGRAM,IPPROTO_UDP))<0)
DIEWERROR(“套接字()失败”);
如果((rcv_sock=socket(PF_INET,sock_DGRAM,IPPROTO_UDP))<0)
DIEWERROR(“套接字()失败”);
//设置recv_插座的计时器
静态int超时=超时\u MS;
setsockopt(rcv_sock,SOL_SOCKET,SO_RCVTIMEO,(char*)和timeout,sizeof(timeout));
如果(recvfrom(rcv_sock,ackBuffer,sizeof(ackBuffer)),0,
(结构sockaddr*)&servAddr2,&fromSize)<0){
//达到超时
printf(“达到超时。重新发送段%d\n”,序号);
num_超时++;
}

SO\u RCVTIMEO
选项需要在
sys/time.h
中定义的
struct timeval
,而不是像您传递给它的那样的整数。
timeval结构
的as字段表示秒,一个字段表示微秒。要将超时设置为100ms,请执行以下操作:

struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;
if (setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) {
    perror("Error");
}
struct-timeval-tv;
tv.tv_sec=0;
tv.tv_usec=100000;
if(setsockopt(rcv_sock、SOL_SOCKET、SO_RCVTIMEO和tv、sizeof(tv))小于0){
佩罗(“错误”);
}

我也有同样的问题。我尝试采用您建议的解决方案,使用
timeval
struct。但它似乎不起作用

我已经阅读了Microsoft文档,时间应该是以毫秒为单位的
DWORD
,但是如果使用
WSASocket
函数创建套接字,还有一件事要做,然后,
dwFlags
参数必须设置
WSA\u FLAG\u OVERLAPPED
属性,超时才能正常工作。
否则超时将永远不会生效。

看起来您没有检查
setsockopt
中的返回值,以查看它是否返回了错误。可能是的
因此,Linux和MacOS上都记录了_RCVTIMEO
以获取
struct timeval
,但您传递的是
int
。尝试传递一个
struct timeval
。另外,为什么要将
&timeout
转换为
char*
?这根本不是一个
char*
。公认的答案是针对POSIX套接字的。Windows提供自己的套接字API,因此接受的答案不适用于Windows。
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;
if (setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) {
    perror("Error");
}