(OMNeT++) 数据包去哪儿了?

(OMNeT++) Where do packets go?

我正在尝试做一个也在此处描述的项目:

我修改了 UdpBasicApp.cc 以满足我的需要,并且在 handleMessage() 函数中我添加了一段代码来检索路由器以太网队列的长度。但是返回的值始终为 0。

我关于路由器队列的 .ned 文件是这样的:

**.router*.eth[*].mac.queue.typename = "DropTailQueue"
**.router*.eth[*].mac.queue.packetCapacity = 51

在UdpBasicApp.cc文件中添加的代码是这样的:

cModule *mod = getModuleByPath("router3.eth[*].mac.queue.");                 
queueing::PacketQueue *queue = check_and_cast<queueing::PacketQueue*>(mod);  
int c = queue->getNumPackets();

所以我的问题是:这是在路由器中创建队列的正确方法 link 通过以太网 link 连接到其他节点吗? 我的怀疑是数据包可能没有通过指定的接口,即我为错误的队列设置了 ini 参数。

您没有创建那个队列。它已经由 OMNeT++ 内核实例化。您只是通过 getModuleByPath() 调用获取对已存在模块的引用。

router3.eth[*].mac.queue. 模块路径在该调用中相当可疑。它在您的所有应用程序中都被硬编码为从 router3 获取队列长度,即使该应用程序安装在 router1 中也是如此。即您正在尝试查看完全不同节点中的队列长度。然后,eth[*] 是错误的。由于路由器显然包含多个以太网接口(否则它就不是路由器),因此您必须明确指定 哪个 您想要分离的接口。您不能在模块路径中指定 patterns(即 eth[0] 或类似的东西,必须指定确切的索引)。此时,您必须回答我对哪个以太网接口感兴趣的问题,并指定该索引。最后 . end end 也是无效的,所以我相信,您的代码永远不会执行,否则 check_and_cast 部分已经引发错误。

如果您想从 same 节点中的 UDP 应用程序到达第一个 enthern 接口,您可以使用相对路径,如下所示:^.eth[0].mac.queue

最后,如果您不确定您的模型是否正常工作,为什么不使用 Qtenv 启动模型,并检查给定的模块是否收到任何数据包?比如,向下钻取模型,直到给定队列作为一个简单模块打开(即您看到队列模块内部是空的),然后点击 run/fast 运行 直到本模块的下一个活动。如果模拟没有停止,那么该模块确实没有收到任何数据包,你的配置有误。