代码之家  ›  专栏  ›  技术社区  ›  CyberFox

插座。得到正确的回应

  •  0
  • CyberFox  · 技术社区  · 6 年前

    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() 而且没有可用的数据。插座只是无限期地阻塞。

    1 回复  |  直到 6 年前
        1
  •  2
  •   usr    6 年前

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

    这意味着。。。没有可用的数据。对方没有发送超过你已经阅读的内容。

    1. 确定协议中没有更多数据。例如,为数据添加长度前缀。然后,你就知道该读多少书了。