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++;
}
它看起來像你沒有檢查'setsockopt'返回值,看看它是否返回一個錯誤。它可能是。 Linux和MacOS上都記錄了'SO_RCVTIMEO',它們採用'struct timeval',但是你傳遞了一個'int'。嘗試傳遞'struct timeval'代替。另外,爲什麼你將'&timeout'強制轉換爲'char *'?它根本不是'char *'。 – Celada