前言
若一个节点有i个相邻的节点,则该节点就有i个接口,每个接口都会有一个ipv4地址,有时我们需要得到某个节点接口的ip,有时我们需要根据一个ipv4地址得到它属于哪个节点。
这部分建议阅读node.cc、ipv4-interface.cc、ipv4-interface-container.cc、ipv4address.cc等源码,官方的源码中有很多很实用的接口。
一、获得节点n第i个接口的ip地址(i为接口索引)
c为节点容器,首先获取到节点的ipv4对象,然后得到第i个接口的地址,具体代码如下:
Ptr<Ipv4> ippp = c.Get(n)-> GetObject<Ipv4> ();
Ipv4Address ipaddress = ippp->GetAddress(i,0).GetLocal();
二、根据ipv4地址得到节点序号
这个过程我在ns3中没有找到相应的接口函数,所以只能自己写。
基本原理:将该ipv4地址与网络中所有节点接口的ipv4地址做对比,找到对应的节点并输出节点序号。
for (int n = 0; n < 14; ++n)//假设网络中有14个节点,需要对所有节点进行遍历
{
Ptr<Ipv4> ippp = c.Get(n)-> GetObject<Ipv4> ();
int interfacenumber = ippp->GetNInterfaces();//得到该节点的接口数目
for (int iterate = 1; iterate < interfacenumber; ++iterate)//遍历该节点的每一个接口
{
Ipv4Address ipaddress = ippp->GetAddress(iterate,0).GetLocal();//获取到所有节点的接口IP地址
if (ipaddress == Destination)//将获取的所有接口IP与目的节点IP比较,并输出节点序号
{
std::cout << "destination node:" << n << endl;
node_number = current_node;
//在接收端将网络观测值Destination_node记录至SDObs中
SDObs[node_number].Destination_node.push_back(i);
}
if (ipaddress == Source)//将获取的所有接口IP与源节点IP比较,并输出节点序号
{
std::cout << "source node:" << i << endl;
}
}
}
# 总结学习NS3首先需要清楚节点、接口及接口地址的一一对应关系,有助于后续理解协议栈安装及应用安装等过程。
版权声明:本文为weixin_42659457原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。