我正在使用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
功能,以便我可以看到统计数据并记录我需要的所有数据?
希望描述足够清楚。 感谢
答案 0 :(得分:1)
事实证明,为个别模块调用两个完成并不是正确的事情。
因此,为了解决这种情况,我将发件人块中的finish()
函数重命名为done()
。这有助于模拟器提供更好的功能,当接收器上的计数器变为零时,调用finish()
函数并完成所有数据收集,甚至可以在消息控制台上显示。
使用单独的模块时需要使用任何其他名称而不是finish()
,例如stopBlock()
或done()
或任何通用名称。确保在完整模拟中调用{strong> ONLY ONCE finish()
。
原因是finish()
函数用于完整的Omnet ++环境,如果任何一个块/模块首先调用它,其他模块将停止运行。