6

NetworkStream.DataAvailable 是否知道发送方的发送缓冲区是否为空?或者它只是简单地表明接收器的读缓冲区是否有数据?我的假设是后者...

具体来说,对于一些涉及正在进行的会话的套接字工作,我目前使用长度前缀,以便接收者确切知道当前批次中有多少数据;但是,我收到了一个 .patch,建议我改用 NetworkStream.DataAvailable。我担心的是,这只会告诉我接收者得到了什么——而不是发送者最初发送的——但我不是套接字专家。

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

(请注意,在流关闭之前,我不能简单地 Read(),因为在同一个连接上发送了多个批次,并且将每个批次视为单独的至关重要;如果我在一个批次中读取太多(即使它被缓冲并丢弃)然后对话将中断)。

4

2 回答 2

5

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

DataAvailable只表示是否有传入数据要读取。您可以在 之前使用它Read(),但它本身并不能为您提供所需的信息。它不会告诉您每批的开始和结束。

我之前已经对来回对话进行了编码,并且在数据中使用了长度前缀。我所做的是编写辅助函数来读取确切数量的字节(一次块),仅此而已。

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

于 2008-10-03T15:22:51.023 回答
2

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

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

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

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

于 2008-10-03T17:06:44.230 回答