C UDP套接字:任意setsockopt行为(使用SO_RCVTIMEO)

时间:2014-08-25 22:33:59

标签: c sockets udp timeout setsockopt

SO_RCVTIMEO根本没有在输出函数中创建超时条件。我正在使用ARQ Sliding Window协议设计文件传输服务。为了保持秩序井然,我从基本的停止等待开始。

这是我对timeval的初始化

    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 100000;

这是我在准备recvfrom超时时使用该结构和套接字

if(setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))<0)
{
fprintf(stderr, "Error in socket option for Timeout mechanism: %s",strerror(errno));
close(sock);
exit(EXIT_FAILURE);
}

if (-1 == bind(sock,(struct sockaddr *)&sa, sizeof(sa)))
{
    perror("error bind failed");
    close(sock);
    exit(EXIT_FAILURE);
}

这是应该超时的代码体:

for(;;)
{
...
while((read_bytes=fread((char*)&(packet.body),sizeof(char),CHUNKSIZE,out_file))
{
...
while(1)
{
bytes_sent = sendto(sock, (struct sanpacket*)&packet, sizeof(struct sanpacket), 0,(struct sockaddr*)&sa, sizeof sa);
if (bytes_sent < 0) 
{
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
}
printf("Waiting for ACK packet\n");

recsize = recvfrom(sock, (struct sanpacket*)&packet, sizeof(struct sanpacket), 0, (struct sockaddr*)&sa, &fromlen);
if(errno == EAGAIN)
{
    printf("Timed out; resending packet with sequence number %d", packet.sequence_num);
    continue;
}
if (recsize < 0) 
{
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
}

}

问题:超时没有触发,但setsockopt也没有返回任何错误。我无法知道我做错了什么。

如果还有其他任何我可以做的澄清我的问题或环境,请告诉我。如果您对调试有任何建议,我会很感激。

1 个答案:

答案 0 :(得分:0)

我忘了提到的背景是这是在Debian Linux上进行编译,而不是在我想要使用的Cygwin平台上进行编译。

所以我在考虑这个完全棘手的问题。然后我回忆起奥卡姆的剃刀并想,对于发生的事情,可能是最简单,最基本的解释?

事实证明,Cygwin并不支持setsockopt超时。

我已经说过一个系统的必要性,你可以在几个小时的生命中吸引开发人员,但是,无论如何,Cygwin是一个很好的Linux模拟器。 / p>