为什么套接字读取0字节,而有更多可用的
本文关键字:套接字 读取 0字节 为什么 | 更新日期: 2023-09-27 17:54:17
我发现以下代码循环时CPU使用率为100%:
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
...
我正在等待套接字。接收方法来读取剩余的字节,但它显然不会导致我的代码在100%循环。
根据jgauffin的建议,文档如下:
如果远程主机关闭套接字连接与关闭方法,并且所有可用的数据都具有当被接收时,Receive方法将立即完成并且返回零字节。
读取0是预期的,但只有在读取所有数据之后,哪个套接字。
Socket文档。
我如何确保最后一个字节被读取?
相关:这是一个关于如何检测依赖于套接字的关闭连接的答案。
你看过文档了吗?
0字节读取表示远程端点已断开连接。
要么使用阻塞套接字,要么使用异步方法,如BeginReceive()
。. net中不需要Poll