Comment implémenter TCP SO_KEEPALIVE en C sur LINUX (Ubuntu)

J’essaie d’implémenter TCP SO_KEEPALIVE pour fermer et reconnecter ma connexion lorsqu’un message Keep Living ne reçoit pas de réponse. Mon problème est que je n’ai pas eu de chance avec cela et je pense (espère) que c’est parce que je ne le fais pas correctement. Vous trouverez ci-dessous un exemple de la manière dont je l’implémente.

//var to re-set socket's timeout value struct timeval timeout; //creates a variable for KEEPALIVE's optval parm int optval; //creates a variable for KEEPALIVE's optlen parm socklen_t optlen = sizeof(optval); // sets KEEPALIVE parms optval = 1; optlen = sizeof(optval); // turns on KEEPALIVE property on socket if (setsockopt (Socket, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) { CloseSocket(Socket, 0); connect(Socket); } 

Votre code ne vous montre que la définition de l’option socket puis sa fermeture immédiate et sa réouverture. La définition de l’option socket ne vous indiquera pas que le keepalive a échoué. Vous obtiendrez cela à la suite de la vérification de la socket (avec une lecture, une écriture, une interrogation / sélection, etc.) La définition de l’option active simplement l’envoi et la vérification persistants. Cherchez ETIMEDOUT comme erreur.

Si TCP KEEPALIVE échoue, vous obtenez une erreur dans la prochaine lecture ou écriture sur le socket après la détection, généralement ECONNRESET. Il ne peut pas être distingué comme une défaillance KEEPALIVE en particulier, juste une erreur d’E / S générale, ce qui est vraiment le cas.