2017-02-21 6 views
1

私は以下のシナリオを想定しています.H1ホストにカスタムUDPアプリケーションがあり、P1とP2がUDPEchoAppを使用する3つのワイヤレスホストH1、P1およびP2(WirelessHostクラス)。OMNeT ++とUDPとのINETワイヤレス通信

考え方は、H1が他の2つにメッセージを送信しますが、スケジュールされた方法で送信することです。 H1はP1にメッセージを送り、P1がエコーを返すのを待つ、P1からのエコーの受信時にのみ、P2にメッセージを送ることができる。

私の質問は:どのように私はこの動作を取得できますか?私はP1とP2にメッセージを送ることができますが、P2に送信する前にP1応答を待つようにH1に指示する方法はわかりません。

また、ARPに関する別の質問です。私は現在arpType = GlobalARPを使用していますが、H1がARP要求を送信するのを避けるにはどうすればいいですか? H1に特定のホストを見つける場所をすでにどのように伝えることができますか?

ネットワークレイヤは本当に必要ではないので、無視してアプリケーションレイヤからMACにメッセージを転送するだけで、適切な宛先アドレスを見つけることができますか?

答えて

1
  1. 単純なステートマシンを導入することで、その動作を実現できます。ただ、例えば、あなたのUDPアプリケーションのクラスで新しい変数を追加します:P1セットにこの変数をパケットを送信した後

    int state; // 0 - beginning, 1 - waiting for P1 response, ... 
    

    state = 1; 
    

    次にhandleMessageWhenUp()、例えば、追加条件を追加します。

    void UDPBasicApp::handleMessageWhenUp(cMessage *msg) { 
        if (!msg->isSelfMessage() && msg->getKind() == UDP_I_DATA) { 
        if (state == 0) { 
         // ... 
        } else if (state == 1) { 
         // take source address 
         cPacket *pk = PK(msg); 
         UDPDataIndication *ctrl = check_and_cast<UDPDataIndication *>(pk->removeControlInfo()); 
         L3Address srcAddress = ctrl->getSrcAddr(); 
         // check if srcAddress is equal to P1 address 
         // if equals: 
         // 1) send a packet to P2 
         // 2) set state = 2 
         // do nothing if srcAddress is not equal to P1 
    
        } else if (state == 2) { 
        // ... 
        } 
        } 
    } 
    
  2. globalARPは、ネットワーク内のすべてのホストによって共有される1つの静的テーブルを使用します。初期化中、各ホストはこのテーブルに自身のアドレスを挿入します。したがって、初期化後にテーブルにはすべてのアドレスが含まれます。 arpType = GlobalARPのホストは、送信するのではなく、このテーブルのエントリを検索するだけで、ARP要求を送信することはありません。

  3. ネットワーク層は、UDPアプリケーションに対して透過的に動作します。 IPv4NetworkConfiguratorのインスタンスは、アドレスを必要とするすべてのインターフェイスにアドレスを割り当てます。したがって、ネットワークレイヤーのために何もする必要はありません。すべての

+0

まず、おかげでお返事を、私は私はこのエラーを取得する、しかし問題を持っています 'check_and_cast():「* INET :: UDPDataIndication」を入力するnullptrをキャストすることはできません'の受信時。 UDPEchoAppからのメッセージなぜなのかご存知ですか?それは特定のパケット構造のためですか? – brid

+0

おそらく、自己メッセージがUDPパケットとして処理されています。残念ながら、 'UDP_I_DATA'は0に等しく、同じ種類の値は自己メッセージを使います。私は私の例を更新し、新しい条件を追加したので、その問題を解決するはずです。 –

+0

まだ動作しません。私が持っているものは実際に次のようなものです: 'if(msg-> isSelfMessage()){//} else if(msg-> getKind()== UDP_I_DATA){// ...}'既に自己メッセージをフィルタリングしています – brid

関連する問題