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

问题描述

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

我已经修改了 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();

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

解决方法

您不是创建该队列。它已经被 OMNeT++ 内核实例化。您只是通过 getModuleByPath() 调用获得对现有模块的引用。

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

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

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