我在.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);
}
答案 0 :(得分:1)
我会查看socket.Available
if socket.Available > 0
处理回调中的所有代码“OnClientReceive”if socket.Available = 0
只有部分“//在这里做一些工作”应该被处理答案 1 :(得分:0)
.NET中的套接字将数据包作为连续的数据流处理,而不是逐个数据包。这就是为什么EndReceive
将阻塞直到数据可用,或者直到连接结束为止。
如果你想逐个数据包捕获收到的数据,我认为你需要使用类似WinPcap库
的东西