NetworkStream.DataAvailable是否看到缓冲的数据?

时间:2020-03-06 15:04:17  来源:igfitidea点击:

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

具体来说,对于某些正在进行的对话的套接字工作,我目前使用一个长度前缀,以便接收方确切知道当前批处理中的数据量;但是,我已经收到一个.patch,建议我改用NetworkStream.DataAvailable。我担心的是,这只会告诉我接收方没有得到发送方最初发送的内容,但我不是套接字专家。

我错了吗?还是长度前缀走的路?

(请注意,在关闭流之前,我不能简单地读取(),因为在同一连接上发送了多个批处理,因此将每个批处理视为分开是至关重要的;如果我在一个批处理中读取过多(即使被缓冲并丢弃),则会话将中断)。

解决方案

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

" DataAvailable"仅指示是否存在要读取的传入数据。我们可以在Read()之前使用它,但是仅凭它并不能为我们提供所需的信息。它不会告诉我们每个批次的开始和结束。

我之前已经编码了来回对话,并且在数据中使用了长度前缀。我所做的是编写帮助程序函数,该函数读取确切数量的字节(一次读取大块),并且不再读取。

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

如果我们需要知道接收方何时收到了特定消息的所有数据,那么我们肯定需要加长前缀。

我通常会定义一个与此类似的结构,该结构会出现在我发送的任何二进制消息的开头。

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

标识符使我们可以确定是否具有协议类型的有效消息。该版本允许我们修改协议。消息类型是消息的类型(即:CommsOnline)。有效负载大小是消息正文的大小。