.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);
}