我使用TCP套接字从一个系统向另一个系统发送一个结构作为字节流。两个系统都是little-endian,struct没有任何浮点数。总之,两个系统中的结构都具有相同的大小(两者都有相同的填充/对齐)。
当我收到字节流时,我将其存储在buffer
中,然后重新构造结构waveShortMessage
,如下所示:
// Receiving Side
waveShortMessage tmp;
memcpy(&tmp, &buffer, sizeof(tmp));
一切都按预期工作,我可以提取结构的不同变量。问题是,我如何确保缓冲区中的字节流属于结构。换句话说,是否有任何安全检查,以便程序通知用户接收的字节流是否不属于waveShortMessage结构。我特别感兴趣的是一个不涉及更改发送方的源代码的解决方案。
答案 0 :(得分:2)
在一些任意字节序列中没有隐藏任何字节来指定这些字节“属于”的内容。
字节序列就是:字节序列。每个字节中有8位。按顺序给定的字节数。原始数据。
如果您要查找流行的互联网协议(如HTTP或SMTP)的正式规范(它们可以广泛使用,只需谷歌搜索),您会发现所有这些高级网络协议都完全充实了,结构化的沟通惯例。电子邮件或网页不仅仅是作为一些神秘的,无定形的字节包而在整个交换器中被炸毁。
双方之间的这种通信,无论是发送电子邮件还是网页,都遵循明确定义的一步一步的程序。建立连接,有关各方通过传输有关数据,在开始业务之前,通过网络连接交换各种欢呼。
然后,数据本身也遵循明确定义的结构。网页以HTML编码,带有一些辅助数据,如CSS。电子邮件消息具有明确定义的结构:一组标题行,每个标题行本身遵循明确定义的约定,空白行,然后是消息的内容。等等。
因此,当发件人和收件人之间发送电子邮件或网页时,没有人怀疑,或者有任何理由对这一切都有什么困惑。
对于仅通过套接字连接爆破包含结构的二进制blob感到不满意,并且希望最好。相反,你需要收集你的要求,坐下来,在几分钟......或者几个小时......或者甚至几天的时间里,并提出一个交换或传输信息的协议以二进制结构进行。
然后,你所要做的就是实现整个事情。
然后,您的发件人和收件人对发送或接收的信息毫无疑问或不确定。