【问题标题】:Data transfer between c++ modulesc++ 模块之间的数据传输
【发布时间】:2016-08-04 10:18:20
【问题描述】:

我有一个非常笼统的问题。我正在尝试在 OSI 的两层的两个模块之间进行通信(假设传输层在 A 类中实现,B 类实现网络层)。我的理解是,A 类可以简单地使用 B 类,通过调用其方法将数据有效负载进一步转发到较低层。因此,A 类具有 B 类的知识,反之则不然。

问题是,当B类从下层接收数据时,由于不知道A类,数据如何转发给A类(上层)。这样的功能在C++中是如何实现的?完成此类任务需要学习哪些重要主题?

【问题讨论】:

  • 这是一个抽象的问题。 C++ 中没有任何这种性质的规则。在设计这样的应用程序时,完全由您来定义和实施所有规则。
  • 对象 A 可以 poll 对象 B 获取数据。或者设置一个callback,B 在接收到数据后调用它。或者完全是别的东西。这个问题可以有很多个答案,而且范围很广。
  • 我想这也很大程度上取决于您拥有的硬件。如果这是像微控制器或 DSP 这样的快速系统,您可能不得不牺牲 OOD 来提高速度。如果系统是一些慢的东西,比如 PC,那么你就拥有了世界上所有的时间。

标签: c++ oop network-programming osi


【解决方案1】:

只需在网络层类中编写 setter/getter 函数即可。当传输层类更新时,它通过getter函数读取网络数据。

让网络成为传输的私有成员甚至可能是有意义的,因为没有网络,传输永远不会存在。

首先用笔和纸画出所有类的依赖关系。修改它们几次,直到你的设计看起来最有意义。

【讨论】:

    【解决方案2】:

    它在内核中的工作方式是传输层在网络层注册一个回调。当网络层接收到必须传输到网络层的数据报时,它调用此回调函数传递网络层数据报的有效负载。网络层数据报知道它必须将数据报的有效载荷传递给特定的传输层协议,因为有一个特定字段指示上层协议。在 IPv4 数据报的情况下,它是字段Protocol

    你可以用不同的方式在 C++ 中实现这个回调:

    1. A 类注册到 B 类以接收发往协议 X 的消息。这可以使用 Observer pattern 来完成。
    2. A 类为协议 X 在 B 中注册回调方法或 lambda

    当 B 收到协议 X 的数据报时,它会通知为该协议注册的观察者,或者调用注册的回调或 lambda。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2017-02-25
      • 2021-12-18
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多