当更多可用时,为什么套接字读取0个字节

时间:2011-05-03 11:39:27

标签: c# .net sockets

我发现以下代码循环使用100%CPU:

byte[] buffer = new byte[0x10000];
while (true) {
    if (socket.Poll (5000000, SelectMode.SelectRead) == false)
        continue;
    int available = socket.Available;
    if (available == 0)
        return;
    int read = socket.Receive (buffer);
    Console.WriteLine ("Read: " + read + " Available: " + available);
    /* ... */
}

输出结果为:

Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
...

我期待socket.Receive方法读取剩余的字节,但显然不会导致我的代码循环为100%。

正如jgauffin所建议的,documentation读到:

  

如果远程主机关闭了   关闭时的套接字连接   方法,所有可用数据都有   已收到,Receive方法会   立即完成,返回零   字节。

所以读取0是预期的,但只有在读取了所有数据之后,哪个socket.Available声明不是。

Socket.Available的文档仅提及抛出异常的已关闭连接。

我怎样才能确保读取最后一个字节?

相关: this是如何检测依赖于套接字的已关闭连接的答案。当没有更多数据且连接已关闭时,可以为0,< / p>

1 个答案:

答案 0 :(得分:11)

您是否阅读过documentation

0字节读取意味着远程端点已断开连接。

使用阻塞套接字或使用BeginReceive()之类的异步方法。 .Net中不需要Poll