我的HTTP请求有时会出现问题。
var bodyBuilder = new List<byte>(4096);
var buffer = new byte[256];
while (socket.Available > 0) {
var responseLength = socket.Receive(buffer, buffer.Length, SocketFlags.None);
for (var i = 0; i < responseLength; i++)
bodyBuilder.Add(buffer[i]);
if (responseLength == 0)
break; // never true btw
}
我读到socket.Available > 0
不应使用,因为它不指示套接字是否已完成,而是指示“这次是否有数据”
https://www.coderanch.com/how-to/java/AvailableDoesntDoWhatYouThinkItDoes(虽然不是C#,也不是Sockets)
这很有意义,因为尝试解析响应时遇到异常。即使手动执行调试器,数据也可以正确接收,因为在执行调试器时,我会慢慢进行
解决方案是将while (socket.Available > 0)
替换为while (true)
,因为一旦服务器关闭连接, responseLength 将为0。 (根据许多消息来源)但这不是正在发生的事情。如果我执行socket.Recieve()
并且没有可用数据。套接字只是无限期地阻塞。
有帮助吗?
答案 0 :(得分:2)
是的,必须删除Available
。套接字通常应具有未完成的单个读取。不应检查是否有数据。只需阅读并处理结果即可。
如果我执行socket.Recieve()并且没有可用数据。套接字只是无限期地阻塞。
这意味着...无可用数据。另一方发送的邮件内容比您已经阅读的内容多。
您可以通过两种方法解决此问题: