首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TFTP的C语言超时实现

TFTP的C语言超时实现
EN

Stack Overflow用户
提问于 2013-05-12 05:08:11
回答 1查看 2K关注 0票数 3

我正在尝试在我的TFTP的c实现中实现超时机制,并且我正在寻找一些通用的帮助。

我想知道的是如何管理超时情况。我使用的过早超时机制是信号/警报功能,但不知何故我被困在如何处理超时,即如果数据包(ack或数据)丢失而发生超时,如何将前一个数据包或ack发送回服务器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-12 05:22:52

尽可能避免信号和警报。

要么使用SO_RCVTIMEO套接字选项,要么只使用超时为T秒的select

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

超时用法示例:

代码语言:javascript
复制
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
    }
}

select用法示例:

代码语言:javascript
复制
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
    }

}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16501741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档