如何在ns-3中监控特定节点的当前队列大小?代码运行异常求助
ns-3监控特定节点队列大小的问题修复
你这段代码无法运行的核心原因是类型不匹配:你用TrafficControlHelper设置的根队列是ns3::DropTailQueue,但它属于Queue类,而你传入MonitorQueueSize函数的参数是Ptr<QueueDisc>,两者不是同一类型,调用GetNPackets()自然会出错。
以下是两种可行的修复方案:
方案1:从QueueDisc中获取实际Queue对象
如果要继续使用DropTailQueue,需要从QueueDisc实例中提取内部的队列对象:
void MonitorQueueSize (Ptr<QueueDisc> queueDisc) { // 动态转换获取DropTailQueue实例 Ptr<Queue<Packet>> queue = DynamicCast<Queue<Packet>>(queueDisc->GetQueue("ns3::DropTailQueue")); if (queue) { uint32_t qSize = queue->GetNPackets(); std::cout << Simulator::Now().GetSeconds() << "s 队列大小: " << qSize << std::endl; } else { std::cerr << "无法获取DropTailQueue实例" << std::endl; } Simulator::Schedule(Seconds(1.0), &MonitorQueueSize, queueDisc); }
方案2:改用QueueDisc类型的队列调度器
直接使用DropTailQueueDisc(属于QueueDisc类的实现)替代DropTailQueue,这样原监控函数可以直接使用:
TrafficControlHelper tchRed10; // 替换为DropTailQueueDisc tchRed10.SetRootQueueDisc("ns3::DropTailQueueDisc", "MaxPackets", UintegerValue(10)); QueueDiscContainer queueDiscs1 = tchRed10.Install(d0d2); Simulator::Schedule(Seconds(1.0), &MonitorQueueSize, queueDiscs1.Get(0)); // 原监控函数无需修改 void MonitorQueueSize (Ptr<QueueDisc> queue) { uint32_t qSize = queue->GetNPackets(); std::cout << Simulator::Now().GetSeconds() << "s 队列大小: " << qSize << std::endl; Simulator::Schedule(Seconds(1.0), &MonitorQueueSize, queue); }
额外提示
- 输出时加上
Simulator::Now()可以更清晰地对应时间点的队列数据 - 确保代码包含必要头文件:
#include "ns3/drop-tail-queue.h"、#include "ns3/drop-tail-queue-disc.h"、#include "ns3/traffic-control-helper.h"
内容的提问来源于stack exchange,提问作者silver_coin
相关产品推荐
相关产品推荐

