如果没有数据可用,如何避免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);
}
没有找到相关结果
已邀请:
2 个回复
剃摧庭峨僳
处理回调中的所有代码“OnClientReceive”
只有部分“//在这里做一些工作”应该被处理 放一些锁以避免冲突
佃蒜狗掂哥
将阻塞,直到数据可用,或直到连接结束。 如果你想逐个数据包捕获接收的数据,我认为你需要使用像WinPcap库这样的东西