代码之家  ›  专栏  ›  技术社区  ›  Marc Gravell

NetworkStream.DataAvailable是否查看缓冲数据?

  •  4
  • Marc Gravell  · 技术社区  · 17 年前

    NetworkStream.DataAvailable是否知道发件人的发送缓冲区是否为空?或者它只是指示接收器的读取缓冲区是否有数据?我的假设是后者。。。

    (注意,在流关闭之前,我不能简单地读取(),因为在同一个连接上发送多个批处理,我必须将每个批处理视为单独的;如果我在一个批处理中读取了太多内容(即使它被缓冲并丢弃),则对话将中断)。

    2 回复  |  直到 8 年前
        1
  •  5
  •   Joel B Fant    17 年前

    连接的一端不知道另一端的发送缓冲区是否为空。

    DataAvailable 仅指示是否有要读取的传入数据。你可以先用它 Read() ,但它本身并不能提供您想要的信息。它不会告诉你每一批的开始和结束。

    我以前对来回对话进行过编码,并且在数据中使用了长度前缀。我所做的是编写助手函数,读取精确的字节数(一次读取块),而不是更多。

    流中批处理值长度的唯一替代方法是检查传入数据并识别批处理的开始和结束。

        2
  •  2
  •   Lounges    17 年前

    如果您需要知道接收者何时收到特定消息的所有数据,那么您肯定需要知道前缀的长度。

    struct Header
    {
      int packetIdentifier;
      int protocolVersion;
      int messageType;
      int payloadSize;
    }