用于TFTP的C超时实现

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

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

尽可能避免信号和警报。

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

如果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 } }