用于TFTP的C超时实现

时间:2013-05-11 21:08:11

标签: c sockets timeout client tftp

我正在尝试在我的TFTP实现中实现超时机制,我正在寻找一些常规帮助。

我想知道的是如何管理超时情况。我使用的过早超时机制是信号/报警功能,但不知怎的,我陷入了如何处理我的超时,即如果丢失数据包(ack或数据)并且发生超时如何发回以前的数据包或确认服务器。

1 个答案:

答案 0 :(得分:5)

尽可能避免发出信号和警报。

使用SO_RCVTIMEO套接字选项或只使用select,超时为T秒。

如果select()调用返回且套接字不在读取集中,或者recvfrom返回时出现超时错误,则可以在代码中采取适当的操作。

超时使用示例:

timeval tv = {0,0};
tv.tv_sec = 5;
socklen_t optionlength = sizeof(tv);
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, optionlength);

while (1)
{
    result = recvfrom(s, buffer, bufferlength, 0);
    if (result == -1) && ((errno == EAGAIN) || (errno == EWOULDBLOCK)) )
    {
       // handle timeout
    }
    else if (result == -1)
    {
       // handle critical error
    }
    else
    {
       // process next packet
    }
}

选择用法示例:

while (1)
{
    timeval tv = {0,0};
    tv.tv_sec = 5;
    fd_set readset = {};
    FD_ZERO(&readset);
    FD_SET(s, &readset);

    select(s+1, &readset, NULL, NULL, &tv);

    if (FD_ISSET(s, &readset))
    {
        result = recvfrom(s, buffer, bufferlength, 0);
        if (result == -1)
        {
            // handle error
        }
        else
        {
            // process packet
        }
    }
    else
    {
       // handle timeout
    }

}