使用 UDP 的 OMNeT++ 和 INET 无线通信

OMNeT++ and INET wireless communication with UDP

我有以下情况:3 个无线主机 H1、P1 和 P2 (class WirelessHost),其中 H1 主机具有自定义 UDP 应用程序,而 P1 和 P2 使用 UDPEchoApp。

想法是 H1 以预定的方式向其他两个发送消息,例如H1向P1发送消息,等待P1回显,只有收到P1的回显,才能向P2发送消息。

我的问题是:我怎样才能获得这种行为?我可以向 P1 和 P2 发送消息,但我不知道如何告诉 H1 在发送到 P2 之前等待 P1 回复。

还有一个关于ARP的问题。我现在正在使用 arpType = GlobalARP 但我想知道,如何避免 H1 发送 ARP 请求?我怎样才能告诉 H1 在哪里可以找到某些主机?

既然网络层不是真正必要的,是否可以忽略它并使用它只是将消息从应用层转发到MAC,然后由它负责找到正确的目的地地址?

  1. 您可以通过引入一个简单的状态机来实现该行为。只需在您的 UDP 应用程序的 class 中添加一个新变量,例如:

    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 使用一个静态 table,由网络中的所有主机共享。在初始化期间,每个主机将自己的地址插入到此 table 中。因此,初始化后 table 包含所有地址。 arpType = GlobalARP 的主机从不发送 ARP 请求,而不是发送它只是在 table.

  3. 中查找条目
  4. 网络层对UDP应用透明工作。 IPv4NetworkConfigurator 的实例将地址分配给所有需要它们的接口。所以你不需要为网络层做任何其他事情。