You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OMNeT++中在udpEchoApp获取AODV节点路由表信息的方法求助

在udpEchoApp中获取AODV节点路由表的解决方案

你的代码问题分析

你之前的代码报错,核心原因有两个:

  1. getSubModule()的参数需要是字符串字面量,你写的routingTableRecorder没有加引号,编译器会把它当作未定义变量处理。
  2. 模块名称错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:00:18