comment traiter avec un serveur fermer TCP
-
05-07-2019 - |
Question
À l’heure actuelle, j’ai un serveur / client TCP simple. Je l'ai configuré pour que chaque fois qu'un client se connecte, il soit forké () et que la connexion elle-même soit placée dans une boucle infinie afin que la connexion reste ouverte. Le serveur reçoit des informations du client. Je vérifie que le nombre d'octets reçus est > 0. Cela a bien fonctionné jusqu'à présent pour déterminer si le client s'est déconnecté. Mais si le serveur se déconnecte, le client s’arrête aussi mais aucune erreur n’est définie. Comment puis-je vérifier que le serveur est toujours connecté?
La solution
Lorsque l'autre extrémité se déconnectera, le socket deviendra lisible (un socket sur le socket ne bloquera pas) et le read ()
renverra 0
. C'est la manière habituelle de détecter la déconnexion (vous avez déjà l'impression de le faire côté serveur).
Si vous êtes bloqué dans un write ()
ou essayez de écrire
sur un socket fermé à l'autre extrémité, votre processus recevra un SIGPIPE
signal et write
renverra -1
avec errno
défini sur EPIPE
.
L'action par défaut pour SIGPIPE
consiste à terminer le processus. Par conséquent, si vous ne l'avez pas modifié, votre client va simplement mourir lorsqu'il essaiera d'écrire sur un serveur qui a disparu.