我发现以下代码会导致CPU使用率达到100%的循环:
输出结果如下:
我原本期望socket.Receive方法读取剩余的字节,但它显然没有这样做,导致我的代码一直循环在100%处。
正如jgauffin所建议的,文档中写道:
如果远程主机使用Shutdown方法关闭Socket连接,并且已经接收到所有可用数据,则Receive方法将立即完成并返回零字节。
因此,读取0有点意料之中,但只有在所有数据被读取后,socket.Available才会声明没有数据可用。 Socket.Available的文档仅提到关闭连接会引发异常。
我该如何确保读取最后一个字节?
相关:这个是一个关于如何检测关闭连接的答案,它依赖于当没有更多数据并且连接已关闭时,socket.Available为0。
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所建议的,文档中写道:
如果远程主机使用Shutdown方法关闭Socket连接,并且已经接收到所有可用数据,则Receive方法将立即完成并返回零字节。
因此,读取0有点意料之中,但只有在所有数据被读取后,socket.Available才会声明没有数据可用。 Socket.Available的文档仅提到关闭连接会引发异常。
我该如何确保读取最后一个字节?
相关:这个是一个关于如何检测关闭连接的答案,它依赖于当没有更多数据并且连接已关闭时,socket.Available为0。