簡體   English   中英

在OMNet ++中兩次接收到信號

[英]Signals are received twice in OMNet++

我創建了自己的OMNet ++偵聽器類,如下所示:

頭文件

#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_ */

抄送文件

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);
}

在這里,我試圖通過增加tempDelmeJustForTest變量來計算EtherMACFullDuplex接收到的以太網幀的數量。

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");
}

它發出一個信號“ packetReceivedFromLower”,並且我的列表器已訂閱它,如上面的代碼所示。

問題是當發送方僅發送6個以太網幀時,計數器顯示tempDelmeJustForTest = 12 為什么呢

在此處輸入圖片說明

另外,我正在引用Inet項目以外的Core4Inet項目。

我猜您正在監聽目標主機的MAC層和交換機的MAC層發出的信號。

通過不僅訂閱您自己的模塊,還訂閱了simulation.getSystemModule()返回的模塊,您可以監聽模擬中任何地方發出的所有packetReceivedFromLower類型的信號。 用戶手冊“訂閱信號”一章提供了有關此機制的更多信息。

如果您想知道監聽到的信號是從哪里發出的,則可以使用receiveSignal方法的source參數。

當發送方發送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++;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM