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

时间:2009-04-21 05:44:11

标签: .net sockets blocking

我在.NET中使用Sockets为异步IO使用BeginReceive()和EndReceive()方法。客户端发送连续的数据包,并调用EndReceive()返回读取的字节数。

问题是客户端正在发送数据包但数据长度为零。它通过分析WireShark中的流量找到了这一点。当数据长度为零时,EndReceive()调用只会阻塞它。

有没有办法识别ZERO长度数据而不会在EndReceive()上实际阻塞?

此外,ReceiveTimeout属性似乎不适用于异步方法。

示例源代码:

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

2 个答案:

答案 0 :(得分:1)

我会查看socket.Available

  1. if socket.Available > 0处理回调中的所有代码“OnClientReceive”
  2. if socket.Available = 0只有部分“//在这里做一些工作”应该被处理
  3. 放一些锁以避免冲突

答案 1 :(得分:0)

.NET中的套接字将数据包作为连续的数据流处理,而不是逐个数据包。这就是为什么EndReceive将阻塞直到数据可用,或者直到连接结束为止。

如果你想逐个数据包捕获收到的数据,我认为你需要使用类似WinPcap

的东西