繁体   English   中英

C ++ IPC通讯

[英]C++ IPC Communication

我在以下情况下无法做出决定。 请需要专家的帮助。

方案:在两个框中运行的两个进程之间存在TCP / IP通信。

通信方法1:在套接字上基于流的通信。 在接收方的哪里,他将接收整个字节缓冲区,并将前几个固定字节解释为标头,然后对其进行反序列化,从而了解消息长度,并开始获取该长度的消息并反序列化,然后继续进行下一个消息标头,如下所示:上....

通讯方式2:将所有消息放入向量中,向量将驻留在类对象中。 一次性将类对象序列化并发送给接收者。 接收器反序列化类对象,并一一读取向量数组。

请让我知道哪种方法有效,如果有其他方法,请指导我。

基于类的数​​据传输和基于结构的数据传输的优缺点,以及哪种情况适合?

您的问题缺少一些关键细节,并且混杂了不同的关注点,使您无法提供一个很好的答案。

具体来说,方法2神秘地“序列化”和“反序列化”对象和包含的向量,而没有指定如何完成操作的任何细节。 实际上,细节是方法1中提到的那种。因此,除非您在使用序列化库和从头做起之间进行选择(在这种情况下,我会说使用库),否则1和2并不是替代方案。因为您是新手,而图书馆更可能会正确解决此问题)。

我可以说:

  • 在TCP级别,读取一个体面大小的块是最有效的(假设我倾向于在PC /服务器硬件上工作,我只使用64k,尽管较小的块可能足以获得相同的吞吐量),并且每次read()recv()从套接字读取尽可能多的数据
    • 在读取了足够的字节(以许多读取/接收次数为单位)以尝试对数据进行某种解释之后,有必要认识到序列化输入的特定部分的结尾:有时在所涉及的数据类型中是隐式的,有时它是使用某些前哨进行通信的(例如换行或NUL),有时可能会有一个固定大小的前缀“ expect N bytes”标头。 此方面/考虑因素通常分层应用于对象流和嵌套的子对象等。
    • TCP读/接收可能传递的数据比任何单个请求中发送的数据都要多,因此,在上面汇编的块的末尾,您可能具有一个或多个字节,这些字节在逻辑上属于后续但不完整的逻辑消息的一部分
    • C ++ iostream已支持读取较大的块然后访问缓冲区中各种固定和可变大小的元素的过程,但是如果需要,可以自行滚动

因此,让我强调一下:不要假设您从套接字的任何给定读取中接收到的字节数都不会超过1个字节:如果您说20字节的标头,则应该循环读取,直到遇到错误或汇编所有20个字节为止。 在单个write()send()中发送20个字节并不意味着将20个字节呈现给单个read() / recv() TCP是字节流协议,在提供字节数时,您必须获取任意数量的字节,直到有足够的数据来解释它为止。 同样,准备获得比客户端在单个write() /`send()中写入的数据更多的数据。

基于类的数​​据传输和基于结构的数据传输的优缺点,以及哪种情况适合?

这些术语完全是伪造的。 类和结构在C ++中几乎是相同的-分组数据和相关函数的机制(它们的区别仅在于它们-默认情况下-将基类和数据成员暴露给客户端代码的方式)。 可以具有成员函数或支持代码,以帮助序列化和反序列化数据。 例如,最简单和最典型的支持是operator<<和/或operator>>流功能。

如果您想通过专门的“编写二进制块,读取二进制块”的方法(例如,将结构视为没有支持代码的POD)来对比这些流函数,那么我想说一下流函数从流式传输到人类可读的表示形式开始,这将使您的系统更容易,更快捷地进行开发,调试和支持。 一旦您真正满意了,如果运行时性能需要它,则可以使用二进制表示形式进行优化。 如果您很好地编写了序列化代码,您将不会注意到较粗的void*/#bytes数据模型与正确的按成员序列化之间的性能差异,但是后者可以更轻松地支持异常情况-跨不同系统的可移植性大小int / longs等,不同的字节顺序,有意的选择是浅层还是深层复制指向的数据等....

我还建议您查看boost序列化库。 即使您不使用它,它也应该使您更好地了解如何在C ++中合理地实现这种事情。

两种方法是等效的。 在两者中,您都必须发送带有消息大小和标识符的标头,以便反序列化。 如果您认为第一个选项是由序列化的“类”组成的,就像普通消息一样,则必须实现相同的“代码”。

您必须牢记的另一件事是消息的大小,以便使用完整的TCP缓冲区来优化通信。 如果您的第一种方法消息太少,请尝试使用较大的消息(如您​​描述的第二种方法)来提高通信比率。

请记住,这不是安全简单地直接将其解释为一个字节序列,即使它是一个简单的POD流出来了一个结构或类-有没有像排列顺序问题(这是不太可能对我们大多数人的现实世界中的问题),以及结构对齐/填充(这一个潜在的问题)。

C ++没有内置的序列化/反序列化功能,您必须自己动手或看一下boost序列化或Google的protobuf之类的东西

如果这不是一项家庭作业或学习项目,那么在TCP流级别上摆弄IPC可能毫无意义,特别是如果这不是人们所不熟悉的。

使用消息传递库(例如ØMQ)发送和接收完整的消息,而不是字节流。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM