【发布时间】:2012-11-12 22:03:05
【问题描述】:
我正在尝试在 UDP 套接字上设置 100 毫秒的超时。我正在使用 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++;
}
【问题讨论】:
-
您似乎没有检查来自
setsockopt的返回值以查看它是否返回错误。它可能是。SO_RCVTIMEO在 Linux 和 MacOS 上均记录为采用struct timeval,但您传递的是int。尝试通过struct timeval代替。另外,为什么要将&timeout转换为char *?这根本不是char *。