为什么套接字读取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字节,而有更多可用的

当没有更多数据并且连接已关闭时,Available为0,

你看过文档了吗?

0字节读取表示远程端点已断开连接。

要么使用阻塞套接字,要么使用异步方法,如BeginReceive()。. net中不需要Poll