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只有部分“//在这里做一些工作”应该被处理
  3. 放一些锁以避免冲突
于 2009-11-26T19:54:59.770 回答
0

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

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

于 2009-04-21T06:49:25.857 回答