OMNeT++中在udpEchoApp获取AODV节点路由表信息的方法求助
在udpEchoApp中获取AODV节点路由表的解决方案
你的代码问题分析
你之前的代码报错,核心原因有两个:
getSubModule()的参数需要是字符串字面量,你写的routingTableRecorder没有加引号,编译器会把它当作未定义变量处理。- 模块名称错误:AODV网络中,路由表并非由
routingTableRecorder模块管理,而是封装在AODVRouting模块内部。
正确实现步骤
1. 确定节点模块层级
先查看你的节点NED文件结构,通常WirelessHost的层级是:WirelessHost -> networkLayer -> routing(类型为AODVRouting)
udpEchoApp的层级是:WirelessHost -> applLayer -> udpEchoApp
2. 编写获取路由表的代码
在udpEchoApp的.cc文件中添加以下代码:
// 1. 获取当前应用所在的节点模块 cModule *node = getParentModule()->getParentModule(); // 从udpEchoApp向上两层到节点 // 2. 找到AODVRouting模块 AODVRouting *aodvRouting = check_and_cast<AODVRouting*>(node->getSubModule("networkLayer")->getSubModule("routing")); // 3. 获取路由表对象 AODVRoutingTable *routingTable = aodvRouting->getRoutingTable(); // 4. 遍历并使用路由表信息 std::vector<AODVRouteEntry> routeList = routingTable->getRoutes(); for (const auto &route : routeList) { // 打印路由信息(可根据需求修改) EV_INFO << "目的地址: " << route.destAddr << " | 下一跳: " << route.nextHop << " | 跳数: " << route.hopCount << endl; }
3. 必要的头文件引入
在.cc文件顶部添加:
#include "AODVRouting.h" #include "AODVRoutingTable.h"
注意事项
- 如果你的节点模块结构不同(比如路由模块直接叫
aodv),需要调整getSubModule()的参数,比如node->getSubModule("aodv")。 - 可以用
dynamic_cast替代check_and_cast来做安全检查,避免找不到模块时崩溃:AODVRouting *aodvRouting = dynamic_cast<AODVRouting*>(targetModule); if (aodvRouting != nullptr) { // 后续操作 }
内容的提问来源于stack exchange,提问作者frog
相关产品推荐
相关产品推荐

