2017-02-21 71 views
1

我有以下情況:3個無線主機H1,P1和P2(WirelessHost類),其中H1主機具有自定義UDP應用程序,而P1和P2使用UDPEchoApp。OMNeT ++和INET與UDP的無線通信

這個想法是,H1以預定的方式將消息發送給另外兩個,例如, H1向P1發送一條消息並等待P1回送,只有在接收到來自P1的回聲後,才能將消息發送給P2。

我的問題是:我該如何獲得這種行爲?我能夠向P1和P2發送消息,但我不知道如何告訴H1在發送給P2之前等待P1答覆。

還有關於ARP的另一個問題。我現在使用arpType = GlobalARP,但我想知道,我怎樣才能避免H1發送ARP請求?我怎麼能告訴H1在哪裏找到某些主機?

由於網絡層並不是真的必要,是否可以忽略它並僅僅用它來將消息從應用層轉發到MAC,MAC然後負責找到正確的目標地址?

回答

1
  1. 可以實現通過引入一個簡單的狀態機行爲。只需添加一個新的變量在UDP應用程序的類,例如:

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

    將數據包發送到P1之後設置此變量:

    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使用一個靜態表,由網絡中的所有主機共享。在初始化期間,每個主機將自己的地址插入到該表中。因此,初始化後表中包含所有地址。具有arpType = GlobalARP的主機從不發送ARP請求,而不是發送它只是查找此表中的條目。

  3. 網絡層透明地工作於UDP應用程序。 IPv4NetworkConfigurator的一個實例爲所有需要它們的接口分配地址。所以你不需要爲網絡層做任何事情。

+0

首先,感謝您的回覆,我有一個問題,雖然,我得到這個錯誤 '的check_and_cast():不能投nullptr鍵入「INET :: UDPDataIndication *」'時的接收。來自UDPEchoApp的消息。你知道爲什麼嗎?是否因爲特定的數據包結構? – brid

+0

自己的消息可能已經作爲UDP數據包進行處理。不幸的是,'UDP_I_DATA'等於0,相同類型的值使用自己的消息。我已更新我的示例並添加了一個新條件,它應該可以解決該問題。 –

+0

仍然無法正常工作。我所擁有的其實是這樣的: 'if(msg-> isSelfMessage()){// ..} else if(msg-> getKind()== UDP_I_DATA){// ...}'已經過濾了自己的消息 – brid