我使用TCP套接字将一个结构作为字节流从一个系统发送到另一个系统。这两个系统都是小端的,结构没有任何浮点数。总而言之,两个系统中的结构具有相同的大小(对它们进行相同的填充/对齐)。
当我收到字节流时,我将其存储在buffer中,然后按如下所示重新构造结构waveShortMessage:
// Receiving Side
waveShortMessage tmp;
memcpy(&tmp, &buffer, sizeof(tmp));一切都像预期的那样工作,我可以提取结构的不同变量。问题是,我如何确保buffer中的字节流属于一个结构。换句话说,是否有任何安全检查,以便程序在收到的字节流不属于waveShortMessage结构时通知用户。我特别感兴趣的是一种不涉及在发送者端更改源代码的解决方案。
发布于 2016-08-24 09:01:22
在一些任意的字节序列中没有隐藏任何东西来指定这些字节“属于”什么。
一个字节序列就是:一个字节序列。每个字节8位。按顺序指定的字节数。原始数据。
如果您查看流行的Internet协议(如HTTP或SMTP )的正式规范(它们随处可见,只需在Google上搜索一下),就会发现所有这些高级网络协议都由完全充实的结构化通信约定组成。一封电子邮件或一个网页不会像一些神秘的、无定形的字节包那样在互联网上爆炸。
双方之间的这些通信,无论是发送电子邮件还是网页,都遵循一个明确定义的、一步一步的过程。建立连接后,相关各方通过网络连接,通过传输相关数据,在开始进行业务之前,交换各种寒趣。
然后,数据本身也遵循定义良好的结构。网页是用HTML编写的,带有一些辅助数据,如CSS。电子邮件消息具有定义良好的结构:一组标题行,每个标题行本身遵循定义良好的约定,一个空行,然后是消息的内容。诸若此类。
因此,当电子邮件消息或网页在发送者和接收者之间发送时,双方都没有任何怀疑,也没有任何理由对这到底是怎么回事感到困惑。
您不满足于通过套接字连接炸掉包含您的结构的二进制blob,并希望得到最好的结果,这一点是正确的。相反,你需要收集你的需求,坐下来,在几分钟的过程中……或者几个小时..。或者甚至几天,然后想出一个协议来交换或传输你的二进制结构中携带的信息。
然后,您所要做的就是实现整个过程。
然后,您的发送者和接收者将不再怀疑或不确定正在发送或接收的信息。
https://stackoverflow.com/questions/39112133
复制相似问题