知道节点ipv4 获取节点编号(节点、接口、接口地址的映射关系)
在ns2中是非常简单的:
iNode1 = (MobileNode*)(Node::get_node_by_address(receiver_iface));//通过ipv4地址获取节点编号 ((MobileNode*)iNode1)->getLoc(&xpos1, &ypos1, &zpos1); //节点的x y z坐标 |
看了源码 node.cc 315行 本质就是遍历所有的node,比对他们的ip地址,如果一样就可以获得node id号
2022年5月6日21:20:18经过一天的搜索加查资料 终于找到最佳解决方法
和ns2的get_node_by_address()函数类似
找到解决方案的经历:
先是百度、谷歌,但是找到的都是在自己的模拟脚本里获取,不是在ns3源码里获取(不过两者获取的原理是一样的:都是遍历所有的节点的所有ipv4,寻找匹配的,然后就可以获得)
这里就有一个问题,思路知道了,但是怎么遍历所有节点、及其ipv4呢。
只能找官方源码是怎么实现的:找了很久找不到,有这么几个关键函数:GetDevice ()、GetNode()但是源码都帮助不大
最后,看书,书有介绍Node类:获取对象的通用方法,即以Node为起点获取各个协议层对象。
最后一条是获取结点对象:最后,各个协议层对象可以使用GetNode()函数来获取所属结点Node对象。脚本中每 一个结点都有一个唯一 IDo可以通过Node::GetId()函数获取
然后在认真谷歌"GetNode() ns3" 本意是想认真找一下ipv4地址怎么转成网络层,然后其他协议层(网络层)再获取node对象。然后在官方源码手册看到了别人已经造好的轮子,美滋滋:GetNodeWithAddress()
来自 https://www.nsnam.org/doxygen/classns3_1_1dsr_1_1_dsr_options.html#a1a91f820f3d754a477a54bad547ca659
是drs路由协议中别人已经造好的轮子
收获:对ns3的node节点、object理解加深!
具体代码:
//通过ipv4地址获取node对象 static inline Ptr<Node> GetNodeWithAddress (Ipv4Address ipv4Address) { //NS_LOG_FUNCTION (this << ipv4Address); int32_t nNodes = NodeList::GetNNodes ();//获取网络中的所有结点数目 for (int32_t i = 0; i < nNodes; ++i)//遍历网络中的所有结点 { Ptr<Node> node = NodeList::GetNode (i);//获得当前遍历的结点对象 Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();//获取当前遍历结点的所有的ipv4地址 int32_t ifIndex = ipv4->GetInterfaceForAddress (ipv4Address);//在地址中找是否有我要找的 //如果找不到返回-1 if (ifIndex != -1) { return node;//找到了,那就是我们要的结点对象 } } return 0; } |
|
【NS3网络仿真】节点、接口、接口地址的映射关系
文章目录
前言
一、获得节点n第i个接口的ip地址(i为接口索引)
二、根据ipv4地址得到节点序号
前言
若一个节点有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首先需要清楚节点、接口及接口地址的一一对应关系,有助于后续理解协议栈安装及应用安装等过程。
————————————————
版权声明:本文为CSDN博主「叶子233」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42659457/article/details/118859723
获取节点 ID
我想从给定节点地址获取节点 ID 假设我的节点地址
是 10.0.0.20 。来自节点的此地址的节点 ID 是什么。
没有这样的功能可以做到这一点。
您必须获取包含所有节点的 NodeList,对其进行迭代并获取每个节点的所有 NetDevice,并在它们的所有接口上获取每个接口的 IP 地址。然后,如果接口地址与您的地址匹配,那么您就有了节点。
如果您想多次进行此搜索,那么我建议您构建一个 std::map,其中包含 IP 地址和字段节点。这将使用与上述相同的方法再次完成。但不是将地址与某物"匹配",而是将其添加到 std::map。当你想搜索一个IP地址时,你会搜索这个地图。
{
There is no such function to do that.
You have to get the NodeList that contains ALL the nodes, iterate on them and get ALL NetDevices of each node, and on ALL interfaces of them and get the IP address of each interface. Then if the interface address matches your address, you have your node.
If you want to do this search more than once, then I would recommend to build a std::map with key the IP address and field the Node. This will be done again with the same approach as above. But instead of "matching" the address with something, you will add it to the std::map. And when you want to search an IP address, you will search this map.
}
来自 <https://groups.google.com/g/ns-3-users/c/m0g-yarRNW8/m/SimefrlJjKoJ>
how to get Node from Ipv4 Address
Hi all,
How to get the Node from the Ipv4 address
InetSocketAddress::ConvertFrom (from).GetIpv4 ());
The above code returns the IPv4 address.how to know the node to which
it is associated.
An IP address is a property of a network interface and not of a node. Try to the find the device which holds that IP address, and then do ->GetDevice ()->GetNode() to get the node.
Thanks for the help
could you please give more extended code to get the Node. I tried, what you explained, but did not get the node.
I have Ipv4Address and need to know to netDevice and further to which Node it is associated.
regards
(disclaimer: I'm saying this out of memory)
In your simulation script, you probably have an
Ipv4InterfaceContainer. You can iterate through it to get (Ptr<Ipv4>,
interface_index) tuples. With the first entity in the tuple (I'll call
it ipv4), do:
if (ipv4->GetInterfaceForAddress (whatever_address_you_want) != -1)
Ptr<node> node_pointer_you_are_looking_for = ipv4->GetObject<Node> ()
But in any case, it's easiest (and fun) to go through the respective
.h files to figure out the APIs. You can also see the doxygen docs.
来自 <https://groups.google.com/g/ns-3-users/c/s45H_Zr9jEQ?pli=1>