我发现以下代码循环使用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>
答案 0 :(得分:11)