如何在omnet ++

时间:2015-10-28 16:59:20

标签: c++ omnet++

我正在使用Omnet ++并创建一个场景,其中发送者不断向接收者发送数据包(从发送者到接收者的单向通信),并且我已经在发送者和接收者的简单模块上设置了计数器。

由于发送方的计数器首先比接收方计数低至零,因此模拟运行良好但不会记录统计数据,因为所有这些都是在接收方完成的。

在计数器减少到零之后,两个模块都会调用finish()函数。

sender::finish()
{
 EV << "message limit reached \n";
 cancelAndDelete(myEvent);
}

接收者的结束功能:

void receiver::finish()
{
  EV << "mean:   "<< iatStats.getMean() << endl;
  EV << "std.dev:   " << iatStats.getStddev() << endl;
  EV << "variance:  " << iatStats.getVariance() << endl;

  iatStats.recordAs("Inter-Arrival Times");
  recordScalar("#IAT", interAT_diff);
}

这里的iat是计算接收器处数据包之间的到达间隔时间。

模拟运行后,首先调用发件人finish(),模拟停止,/results文件夹中只有空白.vec或{{1}文件存在。

终端也说.sca

问题是我怎样才能暂停&#34;一旦计数器用完,发送者阻止并让接收者调用它的simulation fault: core dumped功能,以便我可以看到统计数据并记录我需要的所有数据?

希望描述足够清楚。 感谢

1 个答案:

答案 0 :(得分:1)

事实证明,为个别模块调用两个完成并不是正确的事情。 因此,为了解决这种情况,我将发件人块中的finish()函数重命名为done()。这有助于模拟器提供更好的功能,当接收器上的计数器变为零时,调用finish()函数并完成所有数据收集,甚至可以在消息控制台上显示。

使用单独的模块时需要使用任何其他名称而不是finish(),例如stopBlock()done()或任何通用名称。确保在完整模拟中调用{strong> ONLY ONCE finish()

原因是finish()函数用于完整的Omnet ++环境,如果任何一个块/模块首先调用它,其他模块将停止运行。