2016-04-13 19 views
0

私は非常に一般的な質問があります。私はOSIの2つの層で2つのモジュール間で通信しようとしています(トランスポート層はクラスAで実装され、クラスBではネットワーク層が実装されているとします)。私が理解していることは、クラスAはクラスBを単に使用して、データペイロードをさらに下位レイヤに転送するメソッドを呼び出すことができるということです。したがって、クラスAはクラスBの知識を持ちますが、その逆もありません。C++モジュール間のデータ転送

質問は、クラスBが下位レイヤーからデータを受け取ったとき、クラスAについてわからないので、データがクラスA(上位レイヤー)にどのように転送されるのですか?そのような機能はどのようにC++で実装されていますか?この種の仕事を学ぶ上で重要な話題は何ですか?

+0

これは抽象的な質問です。このような性質のルールはC++では存在しません。このようなアプリケーションを設計するときは、すべてのルールを定義して実装するのはあなた次第です。 –

+0

オブジェクトAはデータのために*オブジェクトBをポーリングできます。または、Bがデータを受け取った後に呼び出す*コールバック*を設定します。または何か完全に。この質問は*多くの答えを持つことができ、広範囲に及ぶものです。 –

+0

私はそれがまたあなたが持っているハードウェアの公正なビットに依存すると思います。これがマイクロコントローラやDSPのような高速システムであれば、速度を上げるためにOODを犠牲にしなければならないかもしれません。システムがPCのような遅いものなら、あなたはいつも世界にいる。 – Lundin

答えて

0

ネットワークレイヤークラスでsetter/getter関数を書くだけです。トランスポート層クラスが更新されると、ゲッター機能を介してネットワークデータを読み込みます。

ネットワークを持たないトランスポートは存在しないため、ネットワークをプライベートなトランスポートのメンバーにすることは意味をなさえます。

まず、すべてのクラス依存関係をペンとペーパーで作成します。最も理にかなっているようなデザインになるまで、数回修正してください。

0

カーネルでの動作は、トランスポート層がコールバックをネットワーク層に登録することです。ネットワーク層は、ネットワーク層に送信されなければならないデータグラムを受信すると、このコールバック関数をネットワーク層データグラムのペイロードを通過させる。ネットワークレイヤデータグラムは、上位レイヤプロトコルを示す特定のフィールドのために、データグラムのペイロードを特定のトランスポートレイヤプロトコルに渡す必要があることを認識しています。 IPv4データグラムの場合は、フィールドProtocolです。

あなたはさまざまな方法でC++でこのコールバックを実装できます

  1. クラスAは、これはObserver patternを使用して行うことができるプロトコルXに宛てたメッセージを受信するためのクラスBに登録します。
  2. クラスAプロトコルX. Bは、プロトコルXのためのデータグラムを受信

ためのコールバックメソッドまたはBでlambdaを登録し、そのプロトコルに対して登録観察者に通知するかは、登録されたコールバックまたはラムダを呼び出します。