c # erkennt TCP-Verbindung trennen

8

Ich habe zwei einfache Anwendungen:

  • Eine Serveranwendung, die auf einen bestimmten TCP-Port wartet, damit ein Client eine Verbindung herstellen kann. Dann hört er was er sagt, sendet Feedback zurück und trennt diesen Client.

  • Eine Formularanwendung, die eine Verbindung zur Serveranwendung herstellt, dann etwas sagt, dann auf die Rückmeldung wartet und die Verbindung zum Server trennt, und dann die Rückmeldung im Formular anzeigen.

Obwohl die Server-Anwendung sich korrekt zu verhalten scheint (ich habe es mit Telnet getestet und ich sehe die Rückmeldung und ich sehe die Trennung direkt nach der Rückmeldung), scheint die Anwendung die Verbindung nicht zu bemerken vom Server . (TcpClient.Connected scheint auch dann wahr zu bleiben, wenn der Server die Verbindung getrennt hat)

Meine Frage ist: Warum bleibt TcpClient.Connected wahr und wie kann ich wissen, ob / wann der Server die Verbindung getrennt hat?

Hier ist mein vollständiger Code:

Formularanwendung:

%Vor%

Serveranwendung:

%Vor%     
nl-x 25.02.2013, 12:30
quelle

2 Antworten

9

TcpClient / NetworkStream wird nicht benachrichtigt, wenn die Verbindung geschlossen wird. Die einzige verfügbare Option ist das Abfangen von Ausnahmen beim Schreiben in den Stream.

Vor einigen Jahren haben wir Sockets anstelle von tcp client verwendet. Socket ist im Vergleich zu tcpclient besser nutzbar.

Es gibt ein paar Methoden, die Sie verwenden können

Poll ist einer von ihnen

Ссылка

Sie können auch das Ergebnis von Write selbst überprüfen. es gibt Ihnen die Anzahl der tatsächlich geschriebenen Bytes.

Die Connected-Eigenschaft selbst spiegelt nur den Zustand bei der letzten Operation wider. Die Dokumentation besagt: "Der Wert der Connected-Eigenschaft gibt den Status der Verbindung seit dem letzten Vorgang an. Wenn Sie den aktuellen Status der Verbindung ermitteln müssen, erstellen Sie einen nicht blockierenden, null Byte langen Sendeaufruf. Wenn der Aufruf gibt erfolgreich zurück oder gibt einen WAEWOULDBLOCK-Fehlercode (10035) aus, dann ist der Socket immer noch verbunden; andernfalls ist der Socket nicht mehr verbunden. "

Ссылка

    
Hermit Dave 25.02.2013, 12:39
quelle
0
%Vor%

Diese Eigenschaft benachrichtigt Sie nicht, wenn der Socket auf der Serverseite geschlossen ist.

In Ihrer Situation können Sie entweder eine "Keepalive" -Funktion implementieren, bei der Sie die Verbindung alle t Minuten / Sekunden abfragen, oder viele Versuche / Fänge hinzufügen, wenn Sie versuchen, vom Socket zu lesen oder zu schreiben. Wenn ich TCP verwende, schließe ich einfach eine Reconnect () -Methode ein, die in jede catch-Anweisung eingefügt wird.

    
chrisevett 25.02.2013 13:24
quelle

Tags und Links