2012-04-23 38 views
1

私はソケットサーバーを作成しています。空のソケットバッファを受け取った場合、ソケット例外が発生することに気付きました。受信コールでは、空のバッファを検出して処理し、ソケットが閉じる前に-1レスポンスをクライアントに返すことはできますか?空のソケットバッファを処理する方法

コード:

try 
{ 
    byte[] byteBuffer = new Byte[1024]; 
    int size = m_clientSocket.Receive(byteBuffer); 
    if (size > 0) 
    { 
     ParseReceiveBuffer(byteBuffer, size); 
    } 
    else 
    { 
     m_clientSocket.Send(BitConverter.GetBytes(-1)); 
    } 
} 
catch (SocketException ex) 
{ 
    if (ex.SocketErrorCode == SocketError.WouldBlock || 
     ex.SocketErrorCode == SocketError.IOPending || 
     ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) 
    { 
     // socket buffer is probably empty, wait and try again 
     Thread.Sleep(1000); 
    } 
    // connection was unexpectively closed 
} 
+0

あなたの意図がはっきりしません。とにかく相手側がソケットをシャットダウンしたときに 'Receive'が0を返すとしか思いません。あなたが「空のソケットバッファを受け取った場合」とは*正確に*何を意味しますか? –

答えて

0

適切な使用でDataAvailable句を使用しました。 これらのすべてのレギュラーを行うための完全なクラスとヘルパーのメソッドを書くことをお勧めします。リスナーはコマンドラインが実行されるのを待つので、 とthread.sleep(1000)は必要ありません。 別のアプローチは、サーバーとクライアントの両方の役割を簡単にシミュレートできる開発済みのソケットライブラリを使用しています.iスーパーソケットは独自のプロトコルをカスタマイズして開発することができます。

1

TCP層で作業していると仮定します。

SendやReceiveなどのソケット機能は、実際にはネットワーク経由でデータを送受信していません。それらは、OSソケット層と通信して、ネットワーキング層からデータをプッシュまたはポップします。 これにより、アプリケーションメソッドSendから実行すると、OSネットワーキング層に送信するためのキューデータが入れられます。そのOSが実際にそれを送信し、いくつかの問題が発生する可能性がありますので、エラーを格納し、アプリケーションからのその特定のソケットメソッド呼び出しの直後にスローします。

これは、前回の呼び出しが失敗した場合、または前と現在の呼び出しネットワークの間に何らかのエラーがあった場合(接続が失われるなど)にSocketExceptionを受け取る理由です。

例外が受信されると、常に何も(0バイト)受信されます。 接続が失われたため(ほとんど(99%)のケースで)、例外の後に何も送信できません。

クライアントにも例外が発生し、接続に関するエラーメッセージが表示されなくなります。

関連する問題