我正在尝试在我的 TFTP 的 c 实现中实现超时机制,我正在寻找一些一般帮助。
我想知道的是如何管理超时情况。我使用的过早超时机制是信号/警报功能,但不知何故我被困在如何处理我的超时,即如果数据包(确认或数据)丢失并且发生超时如何发回前一个数据包或确认服务器。
尽可能避免信号和警报。
要么使用SO_RCVTIMEO套接字选项,要么只使用超时 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
}
}