web-dev-qa-db-fra.com

Que font exactement l'arrêt, la déconnexion, la fermeture et l'élimination du socket?

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?

21
relatively_random

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.

Fermer

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.

Déconnecter

Tout d'abord, Disconnect fait l'équivalent de Shutdown(SocketShutdown.Both).

Ensuite, il bloque, attendant deux choses:

  1. Pour toutes les données d'envoi en file d'attente à envoyer.
  2. Pour que l'autre côté accuse réception du paquet de zéro octet (si applicable au protocole sous-jacent).

Si vous appelez Disconnect(false), les ressources système seront libérées.

Fermer

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é.

Disposer

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.

29
relatively_random