1

ソケット サーバーを作成していますが、空のソケット バッファーを受信すると、socketexception が発生することに気付きました。受信呼び出しで、空のバッファを検出して処理し、ソケットが閉じる前にクライアントに -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
}
4

2 に答える 2

1

TCPレイヤーで作業していると仮定します。

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

そのため、前の呼び出しが失敗したか、前の呼び出しネットワークと現在の呼び出しネットワークの間にエラーが発生した場合 (たとえば、接続が失われた場合) にのみ、次の呼び出しで SocketException を受け取ります。

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

クライアントは例外を受け取り、接続が失われたというエラー メッセージが表示されます。

于 2012-04-23T14:41:11.470 に答える
0

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

于 2012-04-23T14:39:46.770 に答える