使用 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();
取决于数据包的接收方式。
我对接收方的接收数据包感到困扰。 请帮我想办法。 在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();
取决于数据包的接收方式。