使用 INET 数据包通过协议层进行通信

Communicating Through Protocol Layers With INET Packet

我对接收方的接收数据包感到困扰。 请帮我想办法。 在SENDER端,当数据包(通过Udp协议来自UdpBasicApp)到达网络层时,我将其封装如下:

void Sim::encapsulate(Packet *packet) {
    cModule *iftModule = findModuleByPath("SensorNetwork.sink.interfaceTable");
    IInterfaceTable *ift = check_and_cast<IInterfaceTable *>(iftModule);
    auto *ie = ift->findFirstNonLoopbackInterface();
    mySinkMacAddr  = ie->getMacAddress();
    mySinkNetwAddr = ie->getNetworkAddress();
    interfaceId = ie->getInterfaceId();

    //Set Source and Destination Mac and Network Address.
    packet->addTagIfAbsent<MacAddressReq>()->setSrcAddress(myMacAddr);
    packet->addTagIfAbsent<MacAddressReq>()->setDestAddress(mySinkMacAddr);
    packet->addTagIfAbsent<L3AddressReq>()->setSrcAddress(myNetwAddr);
    packet->addTagIfAbsent<L3AddressReq>()->setDestAddress(mySinkNetwAddr);

    packet->addTagIfAbsent<InterfaceReq>()->setInterfaceId(interfaceId);

    //Attaches a "control info" structure (object) to the down message or packet.
    packet->addTagIfAbsent<PacketProtocolTag>()->setProtocol(&getProtocol());
    packet->addTagIfAbsent<DispatchProtocolInd>()->setProtocol(&getProtocol());
}

在 RECEIVER 端,我尝试获取 SENDER 的网络地址,如下所示:

auto l3 = packet->addTagIfAbsent<L3AddressReq>()->getSrcAddress();
EV_DEBUG << "THE SOURCE NETWORK ADDRESS IS : " <<l3<<endl;

当我打印 l3 时, 输出是 DEBUG: THE SOURCE NETWORK ADDRESS IS : <none>

怎么了? 如何通过收到的数据包访问 SENDER 网络地址?

非常感谢。 我将不胜感激

请求标签是您添加到数据包中的东西,将信息向下发送到较低的 OSI 层。在接收端,协议层将使用 指示符标记 对数据包进行注释,以便上层 OSI 层可以在需要时获取该信息。您正在向传入数据包添加一个空的请求标记,所以它是空的也就不足为奇了。您需要的是从数据包中获取 L3AddressInd 标记并从那里提取源地址:

L3Address srcAddr = packet->getTag<L3AddressInd>()->getSrcAddress();

MacAddress srcAddr = packet->getTag<MacAddressInd>()->getSrcAddress();

取决于数据包的接收方式。