OMNeT++中能否在.cc文件而非.ned文件中定义节点连接?
OMNeT++ 动态创建节点连接问题解答
完全可以在.cc代码中动态完成节点连接配置,不需要把所有连接逻辑都提前写死在.ned文件里,这种动态拓扑的实现方式也是OMNeT++非常常用的开发模式。
具体实现要求和步骤
- 首先需要在
.ned定义节点类型时,提前声明好节点后续会用到的端口(gate),支持普通输入/输出端口,也支持双向inout端口,这部分是不能完全省略的,动态连接的前提是两个待连接节点都有预先定义的可用端口。 - 动态连接核心调用
cModule类的端口连接方法即可,示例代码如下:
// 1. 获取待连接的两个节点模块指针,路径根据你自己的拓扑结构调整 cModule *srcNode = getModuleByPath("network.node[0]"); cModule *dstNode = getModuleByPath("network.node[1]"); // 2. 建立连接,可自定义信道参数 srcNode->gate("outPort")->connectTo( dstNode->gate("inPort"), cDatarateChannel::create("linkChannel", 100Mbps) // 也可以不传参数使用默认信道 );
- 如果需要实现双向通信,反向再调用一次
connectTo方法即可。
注意事项
- 动态连接操作建议放在仿真初始化阶段(也就是
initialize()方法的0~2阶段)执行,不要在仿真事件循环已经启动后随意增删连接,避免出现不可预期的时序错误。 - 如果需要删除已有连接,调用对应端口的
disconnect()方法即可,注意手动释放你自行创建的信道资源,避免内存泄漏。 - 除了连接可以动态创建之外,节点本身也支持动态生成:调用
cModuleType::create()方法创建节点实例,执行buildInside()完成节点内部结构初始化后,再执行上述连接操作即可,完全可以做到.ned仅保留空的顶层模块,整个网络拓扑全在.cc中根据算法动态生成。
内容的提问来源于stack exchange,提问作者Tough Guy
相关产品推荐
相关产品推荐

