[英]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.