2010-12-03 9 views
1

Ich habe eine Server/Client-Socket-Anwendung, und aus den Beispielen auf http://msdn.microsoft.com/en-us/library/6y0e13d3.aspx erscheint sowohl der Server als auch der Client Herunterfahren und schließen Sie die Verbindungen nach dem Empfang von Daten.Ist das richtig? Ich hatte trennen benutzen, aber ich war nicht in der Lage, die Verbindung wieder zu öffnen, aber mit der Shutdown/Schließen:Wer die Socket-Verbindung herunterfährt

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

gut zu funktionieren scheint. Aber sollte dies sowohl auf dem Client (Initiator) als auch auf dem Server (Empfänger) Sockets aufgerufen werden? Danke

Antwort

1

Sie müssen dies auf dem Client und dem Server beide tun, da beide unabhängige Ressourcen verwendet haben. Sockets können beim Herunterfahren chaotisch werden (viele Ausnahmen), so dass Sie sicherstellen möchten, dass Sie die Ausnahmen sowohl auf dem Client als auch auf dem Server behandeln.

+0

Es schien überflüssig, dies zu tun, jetzt weiß ich sicher, ich werde die Anrufe in beiden verlassen. Danke – reckface

0

Es spielt keine Rolle, welche Seite das Schließen initiiert. Wenn das Schließen sauber erfolgt, liest die nächste Leseoperation der anderen Seite 0 Bytes. Wenn das Schließen nicht sauber erfolgt, wird die nächste Leseoperation der anderen Seite eine Ausnahme auslösen.

Im Allgemeinen ist es immer eine gute Idee, Ausnahmen von allen Socket-Methoden zu erwarten (außer Close, die keine Ausnahmen außer fatal exceptions auslösen). Wenn Sie eine Ausnahme sehen, rufen Sie einfach Close.

P.S. Connected ist nutzlos, und Shutdown bringt Ihnen in diesem Fall nichts. Rufen Sie einfach Close.

+0

Danke. Ich entferne den Connected-Check. – reckface

+0

In der MSDN-Dokumentation "Wenn Sie einen verbindungsorientierten Socket verwenden, rufen Sie immer die Shutdown-Methode auf, bevor Sie den Socket schließen. Dadurch wird sichergestellt, dass alle Daten auf dem verbundenen Socket gesendet und empfangen werden, bevor sie geschlossen werden." –

+0

Die verbundene Methode sagt Ihnen nicht, dass es derzeit verbunden ist, aber es ist auch nicht völlig nutzlos. Es zeigt Ihnen an, ob der Socket seit der letzten Operation verbunden ist, in den meisten Fällen ist dies jedoch nicht hilfreich. –