0

.NET でソケットを使用して、非同期 IO に BeginReceive() および EndReceive() メソッドを使用しています。クライアントはデータの連続パケットを送信し、EndReceive() を呼び出すと、読み取ったバイト数が返されます。

問題は、クライアントがデータのパケットを送信しているが、データの長さがゼロであることです。これは、WireShark でトラフィックを分析することで発見されました。データの長さがゼロの場合、EndReceive() 呼び出しはそこでブロックされます。

EndReceive() で実際にブロックせずにゼロ長のデータを識別する方法はありますか?

また、ReceiveTimeout プロパティは Async メソッドでは機能しないようです。

サンプル ソース コード:

// This method runs on a separate thread
private void ProcessRequest()
{
   BeginReceive(OnClientReceive);

   // Do some work here in a loop
}

// Callback method
private void OnClientReceive(IAsyncResult result)
{
   int receivedCount = socket.EndReceive(result); // this one blocks

   // Do some work here

   // Again start listening for data
   BeginReceive(OnClientReceive);
}
4

2 に答える 2

1

私はチェックしますsocket.Available

  1. if socket.Available > 0コールバック「OnClientReceive」ですべてのコードを処理します
  2. if socket.Available = 0「// Do some work here」の部分のみを処理する必要があります
  3. 競合を避けるためにいくつかのロックを設定します
于 2009-11-26T19:54:59.770 に答える
0

.NET のソケットは、パケットをパケット単位ではなく、連続したデータ ストリームとして処理します。そのためEndReceive、データが利用可能になるまで、または接続が終了するまでブロックされます。

受信したデータをパケットごとにキャプチャしたい場合は、WinPcapライブラリのようなものを使用する必要があると思います

于 2009-04-21T06:49:25.857 に答える