当我为 PointToPointNetDevice 使用 MacTx TraceSource 时,如何在 NS3 中获取数据包的 source/destination IP 地址?
How to get source/destination IP address of a packet in NS3 when I am using MacTx TraceSource for PointToPointNetDevice?
我正在尝试在 NS3 中模拟 fattree 网络。我有 UdpServerHelper
和 UdpClientHelper
来生成两台主机之间的流量。然后我打电话给
TraceConnectWithoutContext ("MacTx", MakeCallback (&SinkMethod))
在我的一个 NetDeviceContainer 节点上,我的 SinkMethod (Ptr<const Packet> pkt)
被成功调用。我可以使用 pkt->GetSize ()
查看数据包大小,但尽管我花了相当多的时间浏览解决方案,但由于 header 好像是空的。
数据包上的 Headers 可以被 Peek()ed 或 Remove()d。但是,你只能 Peek() top-most header,这里是 link-layer header,例如。 PppHeader.
要访问 higher-layer header,必须先删除前面的 header。按照这些思路应该可以解决问题:
static void
RxDrop(Ptr<const Packet> packet) {
/*
* Need to copy packet since headers need to be removed
* to be inspected. Alternatively, remove the headers,
* and add them back.
*/
Ptr<Packet> copy = packet->Copy();
// Headers must be removed in the order they're present.
PppHeader pppHeader;
copy->RemoveHeader(pppHeader);
Ipv4Header ipHeader;
copy->RemoveHeader(ipHeader);
std::cout << "Source IP: ";
ipHeader.GetSource().Print(std::cout);
std::cout << std::endl;
std::cout << "Destination IP: ";
ipHeader.GetDestination().Print(std::cout);
std::cout << std::endl;
}
我正在尝试在 NS3 中模拟 fattree 网络。我有 UdpServerHelper
和 UdpClientHelper
来生成两台主机之间的流量。然后我打电话给
TraceConnectWithoutContext ("MacTx", MakeCallback (&SinkMethod))
在我的一个 NetDeviceContainer 节点上,我的 SinkMethod (Ptr<const Packet> pkt)
被成功调用。我可以使用 pkt->GetSize ()
查看数据包大小,但尽管我花了相当多的时间浏览解决方案,但由于 header 好像是空的。
数据包上的 Headers 可以被 Peek()ed 或 Remove()d。但是,你只能 Peek() top-most header,这里是 link-layer header,例如。 PppHeader.
要访问 higher-layer header,必须先删除前面的 header。按照这些思路应该可以解决问题:
static void
RxDrop(Ptr<const Packet> packet) {
/*
* Need to copy packet since headers need to be removed
* to be inspected. Alternatively, remove the headers,
* and add them back.
*/
Ptr<Packet> copy = packet->Copy();
// Headers must be removed in the order they're present.
PppHeader pppHeader;
copy->RemoveHeader(pppHeader);
Ipv4Header ipHeader;
copy->RemoveHeader(ipHeader);
std::cout << "Source IP: ";
ipHeader.GetSource().Print(std::cout);
std::cout << std::endl;
std::cout << "Destination IP: ";
ipHeader.GetDestination().Print(std::cout);
std::cout << std::endl;
}