问题描述
我正在尝试做一个也在此处描述的项目:PacketQueue is 0
我已经修改了 UdpBasicApp.cc 以满足我的需要,并且在 handleMessage() 函数中我添加了一段代码来检索路由器的以太网队列的长度。但是返回的值始终为 0。
我关于路由器队列的 .ned 文件是这样的:
**.router*.eth[*].mac.queue.typename = "DropTailQueue"
**.router*.eth[*].mac.queue.packetCapacity = 51
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.如果仿真没有停止,那么该模块确实没有收到任何数据包,您的配置有问题。