gpt4 book ai didi

c++ - C++ IPC通讯

转载 作者:可可西里 更新时间:2023-11-01 02:45:00 26 4
gpt4 key购买 nike

我陷入困境,需要对以下情况做出决定。请需要专家的帮助。

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

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

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

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

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

最佳答案

您的问题缺少一些关键细节,并且混杂了各种问题,使任何无法提供良好答案的尝试都感到沮丧。

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

我可以说:

在TCP级别上使用

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

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

    Also pros and cons of class based data transmission and structure based data transmission and which is suitable for which scenario ?



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

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

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

    关于c++ - C++ IPC通讯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9390227/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com