如果没有数据可用,如何避免Socket.EndReceive()阻塞

我在.NET中使用Sockets为异步IO使用BeginReceive()和EndReceive()方法。客户端发送连续的数据包,并调用EndReceive()返回读取的字节数。 问题是客户端正在发送数据包但数据长度为零。它通过分析WireShark中的流量找到了这一点。当数据长度为零时,EndReceive()调用只会阻塞那里。 有没有办法识别ZERO长度数据而不在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);
}
    
已邀请:
我会检查
socket.Available
if socket.Available > 0
处理回调中的所有代码“OnClientReceive”
if socket.Available = 0
只有部分“//在这里做一些工作”应该被处理 放一些锁以避免冲突     
.NET中的套接字将数据包作为连续的数据流处理,而不是逐个数据包。这就是为什么
EndReceive
将阻塞,直到数据可用,或直到连接结束。 如果你想逐个数据包捕获接收的数据,我认为你需要使用像WinPcap库这样的东西     

要回复问题请先登录注册