我试图在OMNeT ++网络中记录数据包的延迟。我想要存储的是一个元组<延迟,src,dest>。但是,当接收到完整数据包时,目标节点将发出此信号。我认为这不是最好的方法,因为通过这种方式,信号与特定节点即目的地相关联,而这些信息是全局的#34;。
解决方案可以是使用监听器来注册特定信号并收集来自所有节点的所有延迟。但是,如何在不实例化其他cSimpleModule(侦听器)的情况下执行此操作?有可能有一个"静态"听众?更一般地说,这是做我必须做的最好的方法吗?
答案 0 :(得分:2)
假设节点的地址是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);
}
}
在您的NED网络中放置GlobalListener
的实例,并将其称为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);
在完成模拟期间,统计信息将保存为标量。