UDP套接字集超时

我试图在UDP套接字上设置100ms超时。 我正在使用C.我在下面发布了我的代码的相关部分。 我不确定为什么这不是超时,但只是在它没有收到段时挂起。 这仅适用于未使用bind()方法绑定的套接字吗?

#define TIMEOUT_MS 100 /* Seconds between retransmits */ if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) DieWithError("socket() failed"); if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) DieWithError("socket() failed"); //set timer for recv_socket static int timeout = TIMEOUT_MS; setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); if(recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0, (struct sockaddr *) &servAddr2, &fromSize) < 0){ //timeout reached printf("Timout reached. Resending segment %d\n", seq_num); num_timeouts++; } 

SO_RCVTIMEO选项需要在sys/time.h定义的struct timeval ,而不是像传递给它的整数。 timeval struct具有秒的字段和微秒的字段。 要将超时设置为100毫秒,以下应该可以解决问题:

 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"); } 

我也有同样的问题。 我试图采用你建议的解决方案,使用timeval结构。 但它似乎没有用。

我已经阅读了Microsoft文档,时间应该是具有毫秒数的DWORD ,但还有另一件事要做,如果使用WSASocket函数创建套接字,则dwFlags参数必须设置为WSA_FLAG_OVERLAPPED属性超时运行正常。 否则超时永远不会生效。