2012-11-25 60 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"); 
}