插座。正确获得回应

时间:2018-10-09 09:58:12

标签: c# sockets

我的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()并且没有可用数据。套接字只是无限期地阻塞。

有帮助吗?

1 个答案:

答案 0 :(得分:2)

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

  

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

这意味着...无可用数据。另一方发送的邮件内容比您已经阅读的内容多。

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

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