插座.正确获取响应



我的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#,也不是套接字(

这是有道理的,因为我在尝试解析响应时遇到异常。即使在手动单步执行调试器时,数据也会正确接收,因为我在单步执行时执行得很慢

解决方案是将while (socket.Available > 0)替换为while (true)因为一旦服务器关闭连接,响应长度将为 0。(根据许多消息来源(但事实并非如此。如果我执行socket.Recieve()并且没有可用的数据。套接字只是无限期地阻塞。

有什么帮助吗?

是的,必须删除Available。套接字通常应具有未完成的单个读取。不应该有任何检查是否有数据。只需阅读并处理结果。

如果我执行套接字。Recieve(( 并且没有可用的数据。套接字只是无限期地阻塞。

这意味着...没有可用的数据。另一方发送的没有超过您已经阅读的内容。

您可以通过两种方式解决此问题:

  1. 确定没有更多通过协议的数据。例如,为数据添加长度前缀。然后,你知道要读多少。
  2. 使另一端关闭套接字,以便您的读取将结束并返回零字节读取。

最新更新