Laden...

Disconnect zuverlässig erkennen ?

Erstellt von OlafSt vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.025 Views
O
OlafSt Themenstarter:in
79 Beiträge seit 2011
vor 12 Jahren
Disconnect zuverlässig erkennen ?

Hallo Freunde,

der Anfänger mal wieder 😁

Ich bastel gerade einen Client zusammen, der via TCP/IP mit einem Server kommuniziert. Die umherschwirrenden Daten haben nichts mit Web oder Internet zu tun. Ich benutze auf Clientseite den TcpClient.
Nachdem ich die üblichen Klippen umschifft habe (wie bastelt man Threads, was zur Hölle ist Invoke etcpp) möchte ich nun eine saubere Erkennung haben, das die Verbindung zum Server noch steht.

Das Problem daran ist nur: Wie ? Ich kann mich problemlos mit dem Server verbinden und alles funktioniert tadellos. Schließe ich aber den Server (ob nun ordentlich oder per Taskmanager), ist mein Client noch Stunden später der festen Überzeugung, der Server sei noch da. Bin ich vielleicht verwöhnt von Delphi und INDY10, wo so ein Disconnect sofort erkannt wird ? 🤔

Hier im Forum fand ich folgende Routine (war für ein direkt erzeugtes Socket-Objekt, sollte aber mit tcp.Client ebenso gut funktionieren)


try
{
   tcp.Client.Send(new byte[1], 0, 0);
   return true;
}
catch(SocketException e)
{
   return (e.NativeErrorCode == 10035);
}

die aber nicht recht funktioniert. Sobald nämlich einmal die Verbindung stand, liefert sie TRUE zurück, egal ob der Server noch da ist oder nicht.

Wo ist der Baum, der mir die Sicht auf den Wald versperrt ?(

G
538 Beiträge seit 2008
vor 12 Jahren

Das senden funktioniert auch ganz bestimmt (wohnin ist ja ne ganz andere Frage) - nur prüftst du nicht auf Antwort.

//edit: Ups TCP ... streich das oben ... vielleicht musst du "mehr" senden? Schick doch "PING" oder so? 😉

Ich weiß allerdings nicht, ob dich mal jemand auf WCF hingewisen hat - da gibt's Events, wenn die Verbindung tot geht. Und du hast einigen anderen Luxus bei Kommunikationsmethoden ...

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

O
OlafSt Themenstarter:in
79 Beiträge seit 2011
vor 12 Jahren

Von WCF hab ich hier schon allerhand gelesen. Allerdings finde ich in meinem C#-Compiler nicht die kleinste Spur davon. Da bräuchte ich nen kleinen Schubser in die passende Richtung. Dennoch bleibt meine Frage offen und an die C#-Profis hier gerichtet.

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

schau mal in diesem Beitrag von Programmierhans und der folgenden Diskussion:

(Socket) Prüfen ob Client/Server noch online sind

Sobald nämlich einmal die Verbindung stand, liefert sie TRUE zurück, egal ob der Server noch da ist oder nicht.

Das sollte nur beim ersten mal passieren, beim zweiten Sendeversuch gibt's dann die Exception -> steht auch in dem verlinkten Thread.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

O
OlafSt Themenstarter:in
79 Beiträge seit 2011
vor 12 Jahren

Danke für die Hinweise, ich habe dank eurer Schubser eine passable Lösung gefunden.

  1. Man gebe dem NetworkStream einen ReadTimeout mit

  tcp.Connect(IPAddress.Parse(IP), Port);
  ns = tcp.GetStream();
  ns.ReadTimeout = 100; //100ms warten, nicht länger

Im Thread spielt sich das ganze dann unspektakulär ab:


int i;

try
{
  i = ns.ReadByte();
}
catch (IOException e)
{
  i = -2;
}
//i=-2 -> No Data available
//i=-1 -> Server weg
//Ansonsten steht im i unser erstes gelesenes Byte

Das wird mir schon mal ein ordentliches Stück weiterhelfen.

156 Beiträge seit 2010
vor 12 Jahren
ns.ReadTimeout = 100; //100ms warten, nicht länger

das ist je nach Leitung zu Kurz ... bei ISDN kannst Du das vergessen - UMTS (bzw. VPN) ebenfalls ... ich nehme da immer 5 Sekunden