如何为所有信号节点创建侦听器?

随机用户

我正在尝试记录OMNeT ++网络中数据包的延迟。我要存储的是元组<延迟,src,dest>。但是,当目标节点接收到完整的数据包时,它将由目标节点发出该信号。我想这不是最好的方法,因为通过这种方式,信号与特定节点即目标相关联,而此信息是“全局”的。

一种解决方案是使用注册特定信号并收集来自所有节点的所有延迟的侦听器。但是,如何在不实例化其他cSimpleModule(侦听器)的情况下做到这一点?是否可以有一个“静态”侦听器?总的来说,这是我要做的最好的方法吗?

杰西·D。

假设节点的地址是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);
    }
}
  1. GlobalListener在您的NED网络中放置一个实例,然后调用它globalListener

  2. 在您的Node.h添加中:

    // forward declaration
    class GlobalListener;
    

在Node的类中:

GlobalListener * globalListener;
  1. Node.cc添加:

    #include "GlobalListener.h"
    
  2. initialize()Node.cc添加:

    cModule * mod = getModuleByPath("globalListener"); // a name from point 2.
    if (mod) {
        globalListener = dynamic_cast<GlobalListener*>(mod);
    } else {
        error("No globalListener module.");
    }
    
  3. 如果您只想在Node.cc通话中记录延迟

    simtime_t lat = .... ;
    int src = ....;
    int dst = ....;
    globalListener->recordLatency(a, src, dst);
    

在完成模拟过程中,统计信息将另存为标量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为所有滚动事件添加侦听器?

如何为没有JQuery动态创建的元素创建事件侦听器

如何为所有按钮注册单个事件侦听器

如何为所有正在运行的应用程序添加侦听器

如何为所有按钮添加一个事件侦听器

如何为变量创建更改侦听器?

如何为图标创建事件侦听器?

如何为具有 1 个分区的 Kafka 主题创建并发消息侦听器

如何为带有两个swing组件的类创建自己的侦听器

如何为多个函数调用删除一个函数中的所有事件侦听器?

如何删除元素中的所有侦听器?

如何知道何时使用实时 Firebase 数据库中的侦听器从根节点获取所有初始数据

如何在一个div的所有子节点和这些div的数组中添加事件侦听器?

父节点上的事件侦听器也在所有子节点上触发

当我添加侦听器时,ChildEventListener的onAddChild将为所有现有节点触发

删除所有提交的侦听器

所有视图的侦听器

JavaFX8:如何为Tableview中的行选择创建侦听器?

如何为我在Javascript中的forEach循环中创建的每个链接分配事件侦听器

如何为页面脚本中的自定义消息创建事件侦听器

如何为列表中的每个标记创建单独的侦听器

如何为从另一个类引发的事件创建事件侦听器

如何为我们通过 javascript 创建的元素添加事件侦听器?

使用信号侦听器线程 - 如何停止它?

为所有页面创建一个侦听器

如何为活动添加事件侦听器AnyChart 8

如何为Task添加片段范围侦听器?

更改时如何为jtexfield添加侦听器?

如何为WebJob侦听器指定特定队列