NetworkStream.DataAvailable是否知道发件人的发送缓冲区是否为空?或者它只是表明接收者的读缓冲区是否有数据?我的假设是后者......
具体来说,对于涉及正在进行的对话的一些套接字工作,我目前使用长度前缀,以便接收者确切地知道当前批次中有多少数据;但是,我已经发送了一个.patch,建议我使用NetworkStream.DataAvailable。我担心的是,这只会告诉我接收器的内容 - 而不是发送者最初发送的内容 - 但我不是套接字专家。
我错了吗?或者是长度前缀的方式?
(注意我不能简单地读取()直到流关闭,因为在同一个连接上发送了多个批次,并且我将每个批处理视为单独处理是至关重要的;如果我在一个批次中读取太多(即使它被缓冲和丢弃,那么对话也会破裂。)
答案 0 :(得分:5)
连接的一端不知道对方的发送缓冲区是否为空。
DataAvailable
仅指示是否有要读取的传入数据。你可以在Read()
之前使用它,但它本身并不能提供你想要的信息。它没有告诉你每批的开始和结束。
我之前编写了来回对话,我在数据中使用了长度前缀。我所做的是编写辅助函数,读取精确的字节数(一次是块),而不是更多。
流中批量长度值的唯一替代方法是检查传入数据并识别批次的开头和结尾。
答案 1 :(得分:2)
如果您需要知道接收方何时收到特定消息的所有数据,那么您肯定需要加长前缀。
我通常会在我发送的任何二进制消息的前面定义一个与此类似的结构。
struct Header
{
int packetIdentifier;
int protocolVersion;
int messageType;
int payloadSize;
}
使用标识符可以确定您是否拥有协议类型的有效消息。该版本允许您修改协议。消息类型是消息的类型(即:CommsOnline)。有效负载大小是消息正文的大小。