You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:13:26