当更多可用时,为什么套接字读取0个字节
我发现以下代码循环使用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所建议的那样, 文档中写道:
如果远程主机使用Shutdown方法关闭Socket连接,并且已收到所有可用数据 ,则Receive方法将立即完成并返回零字节。
所以读取0是预期的,但只有在读取所有数据之后,哪个socket.Available声称不是。
Socket.Available的文档仅提及抛出exception的已关闭连接。
我怎样才能确保读取最后一个字节?
相关: 这是如何检测依赖于套接字的已关闭连接的答案。当没有更多数据且连接已关闭时,可以为0
你看过文件了吗?
0字节读取意味着远程端点已断开连接。
使用阻塞套接字或使用BeginReceive()
等异步方法。 .Net中不需要Poll
。
上述就是C#学习教程:当更多可用时,为什么套接字读取0个字节分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1045307.html