Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TFTP的C超时实现_C_Sockets_Timeout_Client_Tftp - Fatal编程技术网

TFTP的C超时实现

TFTP的C超时实现,c,sockets,timeout,client,tftp,C,Sockets,Timeout,Client,Tftp,我正在尝试在我的TFTP的c实现中实现超时机制,我正在寻找一些一般性的帮助 我想知道的是如何管理超时情况。我使用的过早超时机制是信号/报警功能,但不知何故,我被困在如何处理超时上,也就是说,如果数据包(ack或数据)丢失并且发生超时,如何将以前的数据包或ack发送回服务器 尽可能避免信号和警报 可以使用套接字选项,也可以在超时T秒的情况下使用 如果select()调用返回并且套接字不在读取集中,或者如果recvfrom返回超时错误,则可以在代码中采取适当的操作 超时使用的示例: timeval

我正在尝试在我的TFTP的c实现中实现超时机制,我正在寻找一些一般性的帮助


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

尽可能避免信号和警报

可以使用套接字选项,也可以在超时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
    }

}

有没有一些例子,我可以得到一个想法。表单还我想知道我是否在一个文件中发送一个,然后在服务器实现文件中接收它,我如何管理它,因为超时在每个文件中有不同的作用域。@EasyQuestions-您需要知道的一切都在这里:谢谢,我以前读过,这是一篇非常棒的文章,但他没有谈论太多超时情况。select和timeout本质上是等价的。我已经发布了以上两个例子。select(或poll)的优点是,您可以让一台服务器同时处理多个套接字。哦,谢谢,现在它更有意义了,不过我编辑了我的原始帖子,以便更好地说明我的问题。如果你能看一下,那就太好了。