gpt4 book ai didi

c# - 我应该在 TCP 传输中手动嵌入数据大小信息吗?

转载 作者:可可西里 更新时间:2023-11-01 02:31:17 25 4
gpt4 key购买 nike

想象一下,你和我正在通过 TCP 发送一个很长的句子(比如 1024000 字节)。

如果你给我写了一个1024000字节的句子,你实际上是用NetworkStream把那些字节写进去的。

我收到的时候,是不是应该提前知道你发的句子的大小?

如果没有,我如何检查何时应该停止 stream.read?

如果是,程序是否应该具有将数据大小嵌入数据头部的功能?所以我先收到 4 个字节,看看我应该读取多少字节?

.Net 有什么东西可以在传输中自动嵌入数据大小吗?

最佳答案

.NET 和 TCP 协议(protocol)都没有内置任何内容来预先定义要发送的消息的大小。 TCP 协议(protocol)仅指定所有数据都将传输到接收端点(或至少将尽最大努力这样做)。

您全权负责定义一种方法,让接收方知道要读取多少数据。你如何做到这一点的细节 - 正如其他人所指出的那样 - 取决于你正在传输的内容的性质:你可以像你提到的那样首先发送长度,你可以编码称为终止符的特殊序列,你可以使用预定义的数据 block 所以所有消息都具有相同的大小等。

编辑

这最初是一条评论,但它的内容超出了该限制。

向流中添加 NULL 只是意味着附加一个具有二进制值 0 的字符(不要与字符 0 混淆)。根据您用于传输的编码(即 ASCII、UTF-8、UTF-16 等),可能会转换为发送一个或多个 0 字节,但如果您使用适当的转换,您只需要输入类似 \0 在你的字符串中。这是一个例子:

string textToSend = "This is a NULL Terminated text\0";
byte[] bufferToSend = Encoding.UTF8Encoding.GetBytes(textToSend);

当然,以上所有内容都假定您发送的所有其余数据不包含任何其他 NULL。这意味着它是文本,而不是任意二进制数据(例如文件的内容)。这非常重要!否则你不能使用 NULL 作为消息终止符,你必须想出另一个方案。

关于c# - 我应该在 TCP 传输中手动嵌入数据大小信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2273639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com