[.net] NetworkStream.DataAvailable是否可以查看缓冲的数据?


Answers

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

我通常定义一个类似于这个的结构,在我发送的任何二进制消息的前面。

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

该标识符可让您确定您是否拥有协议类型的有效消息。 该版本让你修改你的协议。 消息类型是消息类型(即:CommsOnline)。 有效负载大小是消息正文的大小。

Question

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

具体来说,对于涉及正在进行的对话的某些套接字工作,我目前使用长度前缀,因此接收者确切地知道当前批处理中有多少数据; 不过,我已经发送了一个.patch,建议我使用NetworkStream.DataAvailable来代替。 我的担心是,这只会告诉我接收者已经得到了什么 - 而不是发件人最初发送的内容 - 但我不是套接字专家。

我错了吗? 或者是长度前缀的路要走?

(注意直到流被关闭,我才能简单的读取(),因为在同一个连接上发送了多个批处理,而且把每个批处理分开处理是非常重要的;如果我在一个批处理中读取太多得到缓冲和丢弃),那么对话将中断)。