使用 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,然后由它负责找到正确的目的地地址?
您可以通过引入一个简单的状态机来实现该行为。只需在您的 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) {
// ...
}
}
}
globalARP
使用一个静态 table,由网络中的所有主机共享。在初始化期间,每个主机将自己的地址插入到此 table 中。因此,初始化后 table 包含所有地址。 arpType = GlobalARP
的主机从不发送 ARP 请求,而不是发送它只是在 table.
中查找条目
网络层对UDP应用透明工作。 IPv4NetworkConfigurator
的实例将地址分配给所有需要它们的接口。所以你不需要为网络层做任何其他事情。
我有以下情况: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,然后由它负责找到正确的目的地地址?
您可以通过引入一个简单的状态机来实现该行为。只需在您的 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) { // ... } } }
globalARP
使用一个静态 table,由网络中的所有主机共享。在初始化期间,每个主机将自己的地址插入到此 table 中。因此,初始化后 table 包含所有地址。arpType = GlobalARP
的主机从不发送 ARP 请求,而不是发送它只是在 table. 中查找条目
网络层对UDP应用透明工作。
IPv4NetworkConfigurator
的实例将地址分配给所有需要它们的接口。所以你不需要为网络层做任何其他事情。