我创建了自己的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 。为什么?
另外,我是项目引用除Core4Inet
项目之外的Inet
项目。
答案 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++;
}