2009-09-01 4 views
6

die MSDN-Dokumentation für die Eigenschaft Connected auf Buchse folgendes sagen:Wie führe ich einen nicht blockierenden Socket-Aufruf in C#, um den Verbindungsstatus zu ermitteln?

Der Wert der Eigenschaft Connected spiegelt den Zustand der Verbindung als der letzten Operation. Wenn Sie den aktuellen Zustand der Verbindung ermitteln müssen, machen Sie einen nonblocking, Nullbyte Send call. Wenn der Aufruf erfolgreich zurückkehrt oder einen WUEWOULDBLOCK-Fehlercode (10035) auslöst, dann ist der Socket immer noch verbunden; ansonsten ist die Buchse länger verbunden.

Ich muss den aktuellen Status der Verbindung ermitteln - wie mache ich einen nicht blockierenden, Null-Byte-Sendeanruf?

+0

Wäre die Verwendung von HTTP Keepalive gut? –

Antwort

7

Das Beispiel am unteren Rand der MSDN-Dokumentation für die Socket.Connected Eigenschaft (zumindest die .NET Version 3.5) zeigt, wie dies zu tun:

// .Connect throws an exception if unsuccessful 
client.Connect(anEndPoint); 

// This is how you can determine whether a socket is still connected. 
bool blockingState = client.Blocking; 
try 
{ 
    byte [] tmp = new byte[1]; 

    client.Blocking = false; 
    client.Send(tmp, 0, 0); 
    Console.WriteLine("Connected!"); 
} 
catch (SocketException e) 
{ 
    // 10035 == WSAEWOULDBLOCK 
    if (e.NativeErrorCode.Equals(10035)) 
     Console.WriteLine("Still Connected, but the Send would block"); 
    else 
    { 
     Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode); 
    } 
} 
finally 
{ 
    client.Blocking = blockingState; 
} 

Console.WriteLine("Connected: {0}", client.Connected); 
+0

Danke - das habe ich verpasst. – Nosrama

0

Nur zusätzliche Informationen bereitstellt, basierend auf Erfahrung : Die Kommentare unten in den Versionen 3.5 und 4 dieser Dokumentationsseite für Socket.Connect beschreiben meine Erfahrung - das Beispiel hat einfach nicht funktioniert. Ich wünschte wirklich, ich wüsste, warum es für einige und nicht für andere funktioniert.

Als eine Umgehungslösung, trotz der Dokumentation sagt, ich habe das Beispiel geändert, um tatsächlich das 1 Byte ohne Flags zu senden. Dadurch wurde der Status der Connected-Eigenschaft erfolgreich aktualisiert und entspricht dem Senden eines Keep-Alive-Pakets in einem Intervall.

Verwandte Themen