Comment détecter une connexion TCP inactive sous Linux sur C?

J’ai écrit un programme sur C, dans lequel un client envoyait une fois des informations à un serveur. J’ai utilisé des sockets TCP. Et à un moment donné, le serveur a calculé et devrait envoyer le résultat au client. Comment puis-je détecter si la connexion sur le serveur ou le client était interrompue?

Vous voudrez peut-être essayer le Keepalives TCP.

# cat /proc/sys/net/ipv4/tcp_keepalive_time 7200 # cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75 # cat /proc/sys/net/ipv4/tcp_keepalive_probes 9` 

Dans l’exemple ci-dessus, la timer persistante TCP démarre après la période d’inactivité de 7200 secondes. Si les messages de maintien en vie échouent, ils sont retentés toutes les 75 secondes. Après 9 tentatives infructueuses, la connexion sera interrompue.

La durée de conservation peut être modifiée au démarrage en plaçant le script de démarrage dans /etc/init.d.

La seule façon dont un programme puisse savoir avec certitude qu’une connexion TCP est morte est d’essayer d’envoyer quelque chose dessus. La tentative expire ou revient avec une condition d’erreur. Ainsi, le programme n’a besoin de rien faire de spécial – il suffit d’envoyer le contenu pour lequel il a été conçu. Cependant, il doit gérer toutes les conditions d’erreur possibles. À l’expiration du délai, il pourrait réessayer pendant un temps limité ou décider que la connexion est morte. Ce dernier cas est approprié si l’envoi des mêmes données plusieurs fois serait préjudiciable. Après cette situation ou une condition d’erreur, le programme devrait fermer la connexion en cours et, le cas échéant, la rétablir.

TCP Keep-Alive est un moyen fiable de déterminer si l’homologue est mort. C’est le cas si l’application homologue s’est arrêtée sans fermer correctement la connexion TCP ouverte.

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

Cherchez comment activer tcp keep-alives (SO_KEEPALIVE) par socket en utilisant setsockopt call.

Une autre méthode consiste à ce que le client et l’application serveur s’accordent à intervalles réguliers sur les pulsations. La non arrivée des battements de coeur devrait indiquer que l’homologue est mort.