Wie wird eine TCP-Verbindung korrekt geschlossen?

8

Ich habe ein TcpClient-Objekt, das einige Daten an den Server sendet, unter Verwendung der zugrunde liegenden NetworkStream.Write (). Dafür habe ich:

%Vor%

Wenn nun eine Schaltfläche gedrückt wird, sollte die Verbindung geschlossen werden. Was ist der richtige Weg, um die Verbindung zu schließen? Die MSDN-Dokumentation besagt, dass das Schließen des TcpClient (mit .Close ()) den Socket eigentlich nicht schließt, sondern nur die TcpClient-Ressourcen (zumindest so, wie ich die Dokumente verstanden habe).

Würde also der nächste Code die Verbindung korrekt schließen?

%Vor%

Reicht das, oder sollte ich (irgendwie) zuerst prüfen, ob der Stream (oder Server) geschlossen werden kann (falls die Verbindung halb geöffnet ist oder so) ...

Noch mehr, NetworkStream.Close() MSDN docs gibt an, dass es Ressourcen freigibt (sogar Sockets), also wäre es vielleicht genug, den Stream zu schließen, vorausgesetzt, ich verhindere die Verwendung des TcpClients nach diesem Punkt.

Was ist der richtige Ansatz?

    
Kornelije Petak 20.11.2009, 09:17
quelle

3 Antworten

6

Als die Dokumente sagen:

  

Der Aufruf dieser Methode führt schließlich zum Schließen des zugehörigen Sockets und schließt auch den zugehörigen NetworkStream, der verwendet wird, um Daten zu senden und zu empfangen, wenn eine erstellt wurde.

Also wird server.Close(); genug sein.

Das Schließen des NetworkStreams wird jedoch niemals schaden.

Wenn Sie den TcpClient übrigens nur in einer Methode verwenden, dann wickeln Sie ihn in eine using( ) -Anweisung, so dass Sie sicher sind, dass Dispose() (entspricht Close() ) sogar aufgerufen wird Wenn Ausnahmen ausgelöst werden usw.

    
Joren 20.11.2009, 09:20
quelle
3

Ich verbinde eine TCP-Verbindung mit einem Socket.

Im Allgemeinen ist das Verfahren wie folgt:    1. Beenden Sie das Senden der Daten    2. Rufen Sie Socket.Shutdown mit dem SocketShutdown.Send-Parameter auf    3. Loop on Receive, bis es 0 zurückgibt oder mit einer Ausnahme fehlschlägt    4. Rufen Sie Close ()

auf

Hier ist ein kleines Beispiel in Pseudocode, das C # sehr ähnlich ist:)

%Vor%

Wenn der erste und der dritte Schritt übersprungen werden, kann es zu Datenverlust kommen.

Entnommen aus So schließen Sie den TCP-Socket

    
Vadym Stetsiak 20.11.2009 09:33
quelle
0

Sie haben recht, wenn Sie den Stream und dann den Server schließen. Dies sollte dazu führen, dass alle Sockets im Laufe der Zeit erfolgreich geschlossen werden, wie die Dokumentation feststellt. Mehrere Kopfschaben haben mir jedoch im Laufe der Zeit die wichtige Lektion gelehrt:

Vergiss nicht zu spülen!

%Vor%

Sie werden oft Daten verlieren, von denen Sie dachten, dass Sie sie anders gesendet hätten. Dies hilft auch sicherzustellen, dass der Stream leer und inaktiv sein sollte, wenn Sie ihn schließen.

    
Smallgods 20.11.2009 09:24
quelle

Tags und Links