UDP套接字设置超时

我试图在UDP Socket上设置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,而不是像传递给它的整数。时间结构具有秒的字段和微秒的字段。要将超时设置为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");
}
翻译自:https://stackoverflow.com/questions/13547721/udp-socket-set-timeout

转载注明原文:UDP套接字设置超时