信号在OMNet ++中收到两次

时间:2016-03-16 07:55:08

标签: c++ omnet++

我创建了自己的OMNet ++ Listener类,如下所示:

headerfile

#ifndef MYFRAMELISTENER_H_
#define MYFRAMELISTENER_H_



#include <clistener.h>
#include <vector>

class MyFrameListener : public cListener{
public:
    int tempDelmeJustForTest;
    simsignal_t signalIDArray[14];
    int index;
public:
    MyFrameListener();
    virtual ~MyFrameListener();

    virtual void receiveSignal(cComponent *source, simsignal_t signalID, cObject *obj);
};

#endif /* MYFRAMELISTENER_H_ */

cc文件

MyFrameListener::MyFrameListener() {
    this->tempDelmeJustForTest = 0;
}

MyFrameListener::~MyFrameListener() {
}

void MyFrameListener::receiveSignal(cComponent *source, simsignal_t signalID, cObject *obj){
        tempDelmeJustForTest++;
}

SimpleModule cc文件

void ListenersModule::initialize()
{
    // TODO - Generated method body
    frameListener = new MyFrameListener();
    //subscribe("packetReceivedFromLower",frameListener);
    simulation.getSystemModule()->subscribe("packetReceivedFromLower",frameListener);
}


void ListenersModule::handleMessage(cMessage *msg)
{
    // TODO - Generated method body
}


void ListenersModule::finish(){
    //simulation.getSystemModule()->unsubscribe("packetReceivedFromLower",frameListener);
    recordScalar("My Listened Values", this->frameListener->tempDelmeJustForTest);
}

在这里,我试图通过递增EtherMACFullDuplex变量来计算tempDelmeJustForTest中收到的以太网帧数。

EtherMACFullDuplex是位于inet/src/inet/linklayer/ethernet/EtherMACFullDuplex.cc的模块,用于创建Ethernet phy端口。

该类具有如下所示的功能:

void EtherMACFullDuplex::processReceivedDataFrame(EtherFrame *frame)
{
    emit(packetReceivedFromLowerSignal, frame);

    // strip physical layer overhead (preamble, SFD) from frame
    frame->setByteLength(frame->getFrameByteLength());

    // statistics
    unsigned long curBytes = frame->getByteLength();
    numFramesReceivedOK++;
    numBytesReceivedOK += curBytes;
    emit(rxPkOkSignal, frame);

    numFramesPassedToHL++;
    emit(packetSentToUpperSignal, frame);
    // pass up to upper layer
    EV_INFO << "Sending " << frame << " to upper layer.\n";
    send(frame, "upperLayerOut");
}

它发出信号&#34; packetReceivedFromLower&#34;我的列表工作者订阅了它,如上面的代码所示。

当发件人仅发送 6个以太网帧时,问题是计数器显示 tempDelmeJustForTest = 12 。为什么?

enter image description here

另外,我是项目引用除Core4Inet项目之外的Inet项目。

2 个答案:

答案 0 :(得分:1)

我猜你正在听到目的主机MAC层和交换机MAC层发出的信号。

不仅订阅您自己的模块,而且订阅simulation.getSystemModule()返回的模块,您正在听到模拟中任何位置发出的 packetReceivedFromLower 类型的所有信号。 "Subscribing to Signals" chapter of the user manual提供了有关此机制的更多信息。

如果您想知道从哪里发出听到的信号,可以使用source方法的receiveSignal参数。

答案 1 :(得分:1)

当发件人发送6个以太网帧时,计数器tempDelmeJustForTest显示12,因为方法processReceivedDataFrame在您的交换机中涉及6次,在目标主机中涉及6次。 命令:

simulation.getSystemModule()->subscribe("packetReceivedFromLower",frameListener);

表示侦听器将从任何元素(即包括开关)接收信号。
您可以通过在receiveSignal()中添加一行来检查哪个模块发送了信号:

void MyFrameListener::receiveSignal(cComponent *source, simsignal_t signalID, cObject *obj){
  EV << "Signal from " << source->getFullPath() << endl;     
  tempDelmeJustForTest++;
}