我正在尝试记录OMNeT ++网络中数据包的延迟。我要存储的是元组<延迟,src,dest>。但是,当目标节点接收到完整的数据包时,它将由目标节点发出该信号。我想这不是最好的方法,因为通过这种方式,信号与特定节点即目标相关联,而此信息是“全局”的。
一种解决方案是使用注册特定信号并收集来自所有节点的所有延迟的侦听器。但是,如何在不实例化其他cSimpleModule(侦听器)的情况下做到这一点?是否可以有一个“静态”侦听器?总的来说,这是我要做的最好的方法吗?
假设节点的地址是int
类型,我建议以下解决方案。
1.添加一个新的简单模块GlobalListener
:
// GlobalListener.ned
simple GlobalListener { }
// GlobalListener.h
#include <omnetpp.h>
using namespace omnetpp;
class NodesPair {
public:
NodesPair(int _src, int _dst) : src(_src), dst(_dst) {}
bool operator<(const NodesPair& other) const {
if (src == other.src)
return dst < other.dst;
return src < other.src;
}
int src; // int is an address
int dst;
};
class Latency {
public:
Latency() : latencySum(omnetpp::SimTime::ZERO), entries(0) {}
simtime_t latencySum;
int entries;
};
typedef std::map<NodesPair, Latency> LatencyTuples;
class GlobalListener: public cSimpleModule {
protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg);
virtual void finish();
LatencyTuples latencyTuples;
public:
void recordLatency(simtime_t latency, int src, int dst);
};
// GlobalListener.cc
#include "GlobalListener.h"
Define_Module(GlobalListener);
void GlobalListener::initialize() {}
void GlobalListener::handleMessage(cMessage *msg) {}
void GlobalListener::recordLatency(simtime_t latency, int src, int dst) {
Enter_Method_Silent();
NodesPair nodes(src, dst);
if (latencyTuples.find(nodes) == latencyTuples.end()) {
// new entry for this pair
Latency latency;
latencyTuples[nodes] = latency;
}
latencyTuples[nodes].latencySum += latency;
latencyTuples[nodes].entries += 1;
}
void GlobalListener::finish() {
for (auto it : latencyTuples) {
int n = it.second.entries;
simtime_t meanLat = -1; // -1 means: "no latency"
if (n > 0) {
meanLat = it.second.latencySum/n;
}
char scalar[64];
sprintf(scalar, "latency-%d-%d", it.first.src, it.first.dst);
recordScalar(scalar, meanLat);
}
}
GlobalListener
在您的NED网络中放置一个实例,然后调用它globalListener
。
在您的Node.h
添加中:
// forward declaration
class GlobalListener;
在Node的类中:
GlobalListener * globalListener;
在Node.cc
添加:
#include "GlobalListener.h"
在initialize()
中Node.cc
添加:
cModule * mod = getModuleByPath("globalListener"); // a name from point 2.
if (mod) {
globalListener = dynamic_cast<GlobalListener*>(mod);
} else {
error("No globalListener module.");
}
如果您只想在Node.cc
通话中记录延迟:
simtime_t lat = .... ;
int src = ....;
int dst = ....;
globalListener->recordLatency(a, src, dst);
在完成模拟过程中,统计信息将另存为标量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句