2012-11-25 63 views
22

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

#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++; 
} 
+2

它看起来像你没有检查'setsockopt'返回值,看看它是否返回一个错误。它可能是。 Linux和MacOS上都记录了'SO_RCVTIMEO',它们采用'struct timeval',但是你传递了一个'int'。尝试传递'struct timeval'代替。另外,为什么你将'&timeout'强制转换为'char *'?它根本不是'char *'。 – Celada

回答

40

SO_RCVTIMEO选项需要一个struct timevalsys/time.h定义,而不是像你传递给它的整数。 timeval struct具有秒的字段和微秒的字段。要设置超时到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"); 
}