Как добавить flowmonitor во включенное-выключенное приложение? - PullRequest
2 голосов
/ 05 февраля 2020

Может кто-нибудь подсказать, как добавить монитор потока в приложение включения-выключения в NS-3. Модифицированный файл примера сборки успешно создан, но не записан *. xml файл. Ниже приведен код:

Есть предложения? Что здесь не так? похоже, API-интерфейс правильный.

  AsciiTraceHelper ascii;
  Ptr<OutputStreamWrapper> osw = ascii.CreateFileStream ( (tr_name + ".tr").c_str());
  UanPhyDual.EnableAsciiAll (osw);

  std::string tr_name ("ULSR");
  Ptr<FlowMonitor> flowmon;
  FlowMonitorHelper flowmonHelper;
  flowmon = flowmonHelper.InstallAll ();
  flowmon->CheckForLostPackets ();
  std::map<FlowId, FlowMonitor::FlowStats> stats = flowmon->GetFlowStats ();
  for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator m_numNodes = stats.begin (); m_numNodes != stats.end (); ++m_numNodes)
    {
        NS_LOG_UNCOND("Flow ID: " << m_numNodes->first << " Position of sink: " << sink.Get (0) << " Dst Addr " << sinkDev.Get (0));
        NS_LOG_UNCOND("Tx Packets = " << m_numNodes->second.txPackets);
        NS_LOG_UNCOND("Rx Packets = " << m_numNodes->second.rxPackets);
        NS_LOG_UNCOND("Throughput: " << m_numNodes->second.rxBytes * 8.0 / (m_numNodes->second.timeLastRxPacket.GetSeconds()-m_numNodes->second.timeFirstTxPacket.GetSeconds()) / 1024  << " Kbps");
    }


  Simulator::Stop (m_simTime + Seconds (0.6));

  Simulator::Run ();

  flowmon->SerializeToXmlFile ((tr_name + ".flowmon").c_str(), true, true);

  Simulator::Destroy ();

  return m_bytesTotal;
}

Вот вывод командной строки:

[2772/2852] Compiling scratch/uan-rc-example.cc
[2807/2852] Linking build/scratch/uan-rc-example
Waf: Leaving directory `/home/jay/Documents/dev/workspace/ns-allinone-3.30/ns-3.30/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (4.457s)
param=1:  Received 910000 bytes at sink

Спасибо. Любая помощь?

1 Ответ

0 голосов
/ 11 марта 2020

Если я правильно понимаю проблему, вы пытаетесь запустить операторы печати в for-l oop. FlowMonitor собирает статистику моделирования во время его работы. Вы поместили for-l oop перед вызовом Simulator::Run(), поэтому вы пытаетесь распечатать статистику моделирования до его запуска! Я предполагаю, что flowmon->GetFlowStats() возвращает пустую карту, поэтому у вас нет нулевого указателя, который заставил бы вашу программу обработать sh: for для l oop просто обнаруживает, что карта пуста, и не запустить.

Решение простое: переместите следующий код после вызова на Simulator::Run():

flowmon->CheckForLostPackets ();
std::map<FlowId, FlowMonitor::FlowStats> stats = flowmon->GetFlowStats ();
for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator m_numNodes = stats.begin (); m_numNodes != stats.end (); ++m_numNodes)
{
      NS_LOG_UNCOND("Flow ID: " << m_numNodes->first << " Position of sink: " << sink.Get (0) << " Dst Addr " << sinkDev.Get (0));
      NS_LOG_UNCOND("Tx Packets = " << m_numNodes->second.txPackets);
      NS_LOG_UNCOND("Rx Packets = " << m_numNodes->second.rxPackets);
      NS_LOG_UNCOND("Throughput: " << m_numNodes->second.rxBytes * 8.0 / (m_numNodes->second.timeLastRxPacket.GetSeconds()-m_numNodes->second.timeFirstTxPacket.GetSeconds()) / 1024  << " Kbps");
}

Вы также должны переместить вызов flowmon->checkForLostPackets(), поскольку FlowMonitor будет делать это так. окончательный повторный вызов, чтобы определить, какие пакеты отсутствуют (ie. отброшено) после , когда моделирование завершилось.

...