用于网络通信的良好EOF字节

本文关键字:EOF 字节 网络通信 用于 | 更新日期: 2024-10-21 21:27:18

我正在编写一个用于交钥匙网络通信的c#库。我正在寻找一个非模糊字节,我可以在我的库中使用它来指示数据块的末尾。目标是能够发送任何文件或字符串,而不管格式如何。Null字符会不会影响TCP连接,并且任何文件或字符串的数据中都不应该包含Null字符。

提前谢谢。

编辑:BTW客户端和服务器都是我库的一部分,所以它不需要遵守任何其他标准。

答案之后:我将制作一个X字节的数组,然后使用最后一个字节来指示EOF是否位于(X-1)字节块中。

用于网络通信的良好EOF字节

你问不可能的

"任何文件或字符串"可以包括任何字节序列。

这使得完全不可能找到EOF字节。即使是字节序列也不能保证在所有情况下都能工作。

解决方案:提前知道文件大小

将要遵循的数据长度作为通信标头的一部分进行发送。

解决方案:文件大小未知/流式

定义一个数据结构,该结构包括一个标记,表示是否要将更多数据与文件内容分开。

根据定义,这似乎是不可能的。总是表示数据结束的单个字节?但您希望能够发送任何文件,其中可能包括一个可以包括任何字节的二进制文件。很明显,您需要对文件内容进行限制,才能为EOF保留一个字节。

就像评论中提到的Blorgbeard一样,先考虑发送超过数据长度的数据。这可以是一个商定的字节数,表示数据的有效负载将有多长。您的程序读取此元数据,以了解在数据包结束前应该读取多少字节。

另一种解决方案是"转义"数据体中的任何终止字符,例如,如果使用NUL作为终止符,则将任何NUL替换为[ESC][SOH],将任何[ESC]替换为[ECS][ESC]。

这适用于任何长度的流数据,但这确实意味着在两端迭代数据。