UDP套接字设置超时(UDP Socket Set Timeout)

2019-06-21 06:50发布

我想设置一个100毫秒的超时上UDP套接字。 我使用C.我已经发布的低于我的代码relavent件。 我不知道这是为什么不超时,但只是挂起时,没有收到一个段。 这是否不使用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++;
}

Answer 1:

SO_RCVTIMEO选项需要一个struct timeval中定义sys/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");
}


Answer 2:

我也有同样的问题。 我试图采用你建议的解决方案,使用timeval结构。 但它似乎并没有工作。

我已阅读Microsoft文档上的时间应该是一个DWORD以毫秒数,但也有其他的事情,如果是使用创建的套接字WSASocket函数,那么dwFlags参数必须具有WSA_FLAG_OVERLAPPED属性的设置超时才能正常工作。 否则,超时从未生效。



文章来源: UDP Socket Set Timeout
标签: c sockets udp