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

时间:2012-08-07 03:53:00

标签: c# sockets tcp network-programming eof

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

提前致谢。

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

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

3 个答案:

答案 0 :(得分:10)

你问不可能的

“任何文件或字符串”可以包含任何字节序列。

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

解决方案:事先知道文件大小

发送要跟随的数据长度作为通信标头的一部分。

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

定义一个包含标记的数据结构,是否有更多数据与文件内容分开。

答案 1 :(得分:4)

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

与评论中提到的Blorgbeard一样,请先查看发送数据的长度。这可以是商定的字节数,表示数据的有效载荷将持续多长时间。您的程序会读取此元数据,以了解在数据包结束之前应该读取的字节数。

答案 2 :(得分:1)

另一种解决方案是“逃避”数据正文中的任何终止字符,例如。如果使用NUL作为终结者,用[ESC] [SOH]替换任何NUL,用[ESC] [ESC]替换任何[ESC]。

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