Il est étonnamment difficile de trouver une explication simple sur ce que font ces quatre méthodes en fait, destinées aux débutants en programmation réseau. Les gens déclarent généralement ce qu'ils pensent être la bonne façon de fermer une prise dans un scénario particulier, mais pas ce qui se passe en arrière-plan derrière chaque étape.
En vous basant sur la philosophie de l'enseignement à l'homme, pouvez-vous expliquer les méthodes Shutdown
, Disconnect
, Close
et Dispose
?
Un réponse sur StackOverflow m'a fait penser que j'ai enfin atteint un aperçu d'une compréhension. Ensuite, je suis allé tester un peu et voici le résumé de l'avis d'un débutant. Veuillez me corriger si je me trompe car cela est basé sur l'inférence, pas sur l'expertise.
Shutdown
désactive les méthodes Send
et/ou Receive
, selon l'argument fourni. Il ne désactive pas la gestion du protocole sous-jacent et ne bloque jamais.
Si Send
est désactivé, il met également en file d'attente un paquet d'envoi de zéro octet dans le tampon d'envoi sous-jacent. Lorsque l'autre côté reçoit ce paquet, il sait que votre socket n'enverra plus de données.
Si Receive
est désactivé, toutes les données que l'autre côté pourrait essayer d'envoyer seront perdues.
Si Receive
est désactivé sans désactiver Send
, cela empêche simplement le socket de recevoir des données. Puisqu'aucun paquet de zéro octet ne sera envoyé, l'autre côté n'en saura rien jusqu'à ce qu'il essaie d'envoyer quelque chose, et seulement si le protocole du socket nécessite un accusé de réception.
Tout d'abord, Disconnect
fait l'équivalent de Shutdown(SocketShutdown.Both)
.
Ensuite, il bloque, attendant deux choses:
Si vous appelez Disconnect(false)
, les ressources système seront libérées.
Close
libère les ressources système. Peut arrêter brutalement l'envoi de données en file d'attente. S'il est appelé avec l'argument, attendra l'envoi des données, mais uniquement jusqu'au délai spécifié.
Dispose
est identique à la surcharge Close
sans l'argument timeout. Pour être plus précis, Close
sans timeout est identique à Dispose
.
Si vous utilisez le bloc using
sur le socket, il appellera automatiquement Dispose
.