2009-09-01 29 views
6

MSDNのドキュメントは、次の言う:C#で非ブロッキングソケットコールを作成して接続状態を確認するにはどうすればよいですか?ソケット上に接続されたプロパティの

接続プロパティ の値は、最新の操作のような接続 の状態を反映しています。 接続の現在の の状態を判別する必要がある場合は、 を非ブロックのゼロバイト送信コールにします。 呼び出しが成功した場合、または がWAEWOULDBLOCKエラーコード (10035)をスローした場合、ソケットはまだ接続されています。 。それ以外の場合、ソケットは接続されていないため、 に接続されていません。

接続の現在の状態を判断する必要があります。ノンブロッキングのゼロバイト送信コールを作成するにはどうすればよいですか?

+0

HTTPキープアライブを使用しても問題ありませんか? –

答えて

7

Socket.Connectedプロパティ(少なくとも、.NET 3.5版)のためのMSDNドキュメントの下部にある例は、これを実行する方法を示しています。ただ、経験に基づいて、追加情報を提供する

// .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

ありがとう - これを逃した。 – Nosrama

0

Socket.Connectのドキュメントページのバージョン3.5と4の最後にあるコメントは私の経験を説明しています。この例は単純に機能しませんでした。本当になぜ私はそれが他人ではなく一部の人にとってうまくいくのかを知りたがっています。

回避策として、ドキュメントに記載されている内容にもかかわらず、実際にフラグを設定せずに1バイトを送信するようにサンプルを変更しました。これにより、Connectedプロパティの状態が正常に更新され、一定の間隔でキープアライブパケットを送信することと同等です。

関連する問題