En TCP, il n'y a qu'une seule façon de détecter une déconnexion ordonnée, et c'est en obtenant zéro comme valeur de retour de la fonction read()/recv()/recvXXX()
en lisant.
Il n'existe également qu'un seul moyen fiable de détecter une connexion interrompue : en écrivant sur celle-ci. Après un nombre suffisant d'écritures sur une connexion rompue, TCP aura effectué suffisamment de tentatives et de délais d'attente pour savoir qu'elle est rompue et finira par causer des problèmes de sécurité. write()/send()/sendXXX()
pour retourner -1 avec un errno/WSAGetLastError()
valeur de ECONNRESET,
ou, dans certains cas, "la connexion a expiré". Notez que ce dernier cas est différent du "connect timeout", qui peut se produire pendant la phase de connexion.
Vous devez également fixer un délai de lecture raisonnable et supprimer les connexions qui ne le respectent pas.
La réponse ici sur ioctl()
y FIONREAD
est une absurdité compétitive. Tout ce que cela fait, c'est vous dire combien d'octets sont actuellement dans le tampon de réception de la socket, disponibles pour être lus sans blocage. Si un client ne vous envoie rien pendant cinq minutes, il ne s'agit pas d'une déconnexion, mais d'un blocage. FIONREAD
à zéro. Ce n'est pas la même chose : c'est loin d'être le cas.
0 votes
Regardez ici (pour les pires scénarios) : tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html (Vérification des pairs morts)
5 votes
Parce qu'il y a tellement de réponses fausses et trompeuses, voici la bonne réponse : Suivez les spécifications du protocole que vous implémentez au-dessus de TCP. Il doit préciser si cela se fait par des délais d'attente, des échecs d'écriture ou tout autre mécanisme. Si vous concevez un protocole, assurez-vous de concevoir un moyen de détecter la déconnexion du client, si cela est nécessaire.