2017-02-21 130 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