Aucune des réponses de dire aux gens comment shutdown
et close
travaille dans le protocole TCP niveau, il est donc utile d'ajouter ce.
Le standard de connexion TCP résilié par 4 chemin de finalisation:
- Une fois que le participant n'avons plus de données à envoyer, il envoie un paquet FIN de l'autre
- L'autre partie renvoyer un accusé de réception pour la FIN.
- Lorsque l'autre partie a également terminé le transfert de données, il envoie un autre paquet FIN
- L'initiale des participants renvoyer un accusé de réception et de finaliser le transfert.
Cependant, il existe un autre "émergentes" pour la fermeture d'une connexion TCP:
- Un participant envoie un paquet RST et l'abandon de la connexion
- De l'autre côté reçoit un premier puis l'abandon de la connexion ainsi
Dans mon test avec Wireshark, avec les valeurs par défaut des options de socket, shutdown
envoie un paquet FIN à l'autre bout, mais c'est tout ce qu'il fait. Jusqu'à ce que l'autre partie de vous envoyer le paquet FIN, vous êtes toujours en mesure de recevoir des données. Une fois que cela s'est produit, votre Receive
obtiendrez un 0 résultat de taille. Donc, si vous êtes la première à l'arrêt "envoyer", vous devez fermer le socket une fois que vous avez terminé la réception de données.
D'autre part, si vous appelez close
, tandis que la connexion est toujours en vie, un premier paquet va être envoyé à l'autre côté. C'est bon pour les erreurs. Par exemple, si vous pensez que l'autre partie a fourni des données erronées ou il a refusé de fournir des données (OS attaque?), vous pouvez fermer le socket tout de suite.
Mon avis de règles serait:
- Toujours
shutdown
avant close
lorsque c'est possible
- Si vous avez fini de les recevoir (0 taille des données reçues) avant l'arrêt, fermer la connexion après le dernier d'envoyer des finitions
- Si vous voulez fermer la connexion, normalement, à la fermeture de la connexion, et attendre jusqu'à ce que vous recevez un 0 de données de taille, et ensuite fermer le socket.
- En tout cas, si timed out ou de toute autre erreur s'est produite il suffit de fermer la socket.