Tiempo de espera de implementación en C para TFTP

Estoy tratando de implementar el mecanismo de tiempo de espera en mi implementación c de TFTP, y estoy buscando ayuda general.

Lo que me pregunto es cómo manejar la situación de tiempo de espera. El mecanismo de tiempo de espera prematuro que utilicé es con las funciones de señal / alarma, pero de alguna manera estoy atascado en cómo manejar mis tiempos de espera, es decir, si se pierde el paquete (ack o datos) y se produce un tiempo de espera, cómo enviar el paquete anterior Ack al servidor.

Evite la señal y la alarma si es posible.

Use la opción de socket SO_RCVTIMEO o simplemente seleccione seleccionar con un tiempo de espera de T segundos.

Si la llamada select () regresa y su socket no está en el conjunto de lectura, o si recvfromrom devuelve con un error de tiempo de espera, entonces puede tomar la acción apropiada en su código.

Ejemplo de uso de timeout:

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

Ejemplo de uso selecto:

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