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