2010-12-03 9 views
1

J'ai une application de socket serveur/client, et à partir des exemples sur http://msdn.microsoft.com/en-us/library/6y0e13d3.aspx il apparaît à la fois le serveur et le client arrêt et ferme les connexions après réception des données. Est-ce vrai? J'avais utilisé mais je déconnexion été incapable de rouvrir la connexion, mais en utilisant l'arrêt/fermeture:Qui ferme la connexion socket

  if (_sender.Connected) 
      { 
       _sender.Shutdown(SocketShutdown.Both); 
       _sender.Close(); 
      } 

semble fonctionner très bien. Mais devrait-il être appelé à la fois sur le client (initiateur) et le serveur (destinataire) sockets? Merci

Répondre

1

Vous devez le faire sur le client et le serveur car ils ont tous les deux des ressources indépendantes utilisées. Les sockets peuvent être en désordre (beaucoup d'exceptions) quand ils s'arrêtent, donc vous voulez vous assurer que vous gérez les exceptions aussi bien sur le client que sur le serveur.

+0

Cela semblait redondant de le faire, maintenant je sais que je vais laisser les appels dans les deux. Merci – reckface

0

Peu importe de quel côté initie la fermeture. Si la fermeture se déroule proprement, l'opération de lecture suivante de l'autre côté lira 0 octet. Si la fermeture ne se produit pas correctement, l'opération de lecture suivante de l'autre côté déclenche une exception.

En général, il est toujours préférable d'attendre des exceptions de toutes les méthodes de socket (sauf Close, qui ne déclencheront pas d'exceptions sauf pour fatal exceptions). Chaque fois que vous voyez une exception, appelez simplement Close.

P.S. Connected est inutile, et Shutdown ne vous gagne rien dans ce cas. Appelez simplement Close.

+0

Merci. Je vais retirer le chèque connecté. – reckface

+0

Selon la documentation MSDN «Lorsque vous utilisez un socket orienté connexion, appelez toujours la méthode Shutdown avant de fermer le socket, afin que toutes les données soient envoyées et reçues sur le socket connecté avant sa fermeture. –

+0

La méthode connectée ne vous dit pas qu'elle est actuellement connectée mais elle n'est pas complètement inutile non plus. Il vous dit si le socket était connecté depuis la dernière opération, dans la plupart des cas, cela ne sera pas utile. –

Questions connexes