【发布时间】:2018-05-29 14:23:18
【问题描述】:
我是 OMNET++ 的新手,需要您的帮助。我正在进行模拟,其中数据包需要从一个模块发送到另一个模块,而无需等待第一个模块发送所有数据包。
------------- ------------ -------------
| Module A | --> | Module B | --> | Module C |
------------- ------------ -------------
现在如果模块 A 通过模块 B 向模块 C 发送 5 个数据包,模块 B 等待所有 5 个数据包接收,并在收到所有 5 个数据包后开始向模块 C 发送。
我想要的是,如果模块B收到一个数据包,它需要直接发送到模块C,而不是等待模块A发送所有数据包。
请查看附件图片以供参考。在这张图片中,您可以看到中间 4 个模块保留所有数据包并在模块 1 发送所有数据包时开始转发。
提前感谢您的帮助。
模块 A 代码
#include <string.h>
#include <omnetpp.h>
#include <iostream>
#include <cstdlib>
using namespace omnetpp;
class QKDProcessor : public cSimpleModule
{
private:
int randomGate;
int counter = 0 ;
protected:
virtual void handleMessage(cMessage *msg) override;
};
Define_Module(QKDProcessor);
void QKDProcessor::handleMessage(cMessage *msg)
{
if(strcmp("QuantumStatesProcessorBob", getName()) == 0)
{
delete msg;
if(counter == 0)
{
cMessage *keyCheck = new cMessage("T");
send(keyCheck,"out",0);
}
counter++;
}
else
{
std::string key = msg->getName();
delete msg;
char *stat = new char[key.length()+1];
strcpy(stat, key.c_str());
for(int i=0; i<key.length(); i++)
{
// Selecting random gates
double x = rand()/static_cast<double>(RAND_MAX+1);
randomGate = 0 + static_cast<int>( x * (4 - 0) );
// Create individual message for each bit.
std::string j = std::string(1,stat[i]);
cMessage *quantumState = new cMessage(j.c_str());
send(quantumState,"out", randomGate);
}
}
}
模块 B 代码
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;
class PolarizationFilter : public cSimpleModule
{
protected:
virtual void handleMessage(cMessage *msg) override;
};
Define_Module(PolarizationFilter);
void PolarizationFilter::handleMessage(cMessage *msg)
{
send(msg,"polarizaedLight",0);
}
模拟日志
** Initializing network
Initializing module QKDNetwork, stage 0
QKDNetwork.AliceProcessor: Initializing module QKDNetwork.AliceProcessor, stage 0
QKDNetwork.BobProcessor: Initializing module QKDNetwork.BobProcessor, stage 0
QKDNetwork.AlicePublicChannel: Initializing module QKDNetwork.AlicePublicChannel, stage 0
QKDNetwork.BobPublicChannel: Initializing module QKDNetwork.BobPublicChannel, stage 0
QKDNetwork.FilterA: Initializing module QKDNetwork.FilterA, stage 0
QKDNetwork.FilterB: Initializing module QKDNetwork.FilterB, stage 0
QKDNetwork.FilterC: Initializing module QKDNetwork.FilterC, stage 0
QKDNetwork.FilterD: Initializing module QKDNetwork.FilterD, stage 0
QKDNetwork.Alice_Quantum_Channel: Initializing module QKDNetwork.Alice_Quantum_Channel, stage 0
QKDNetwork.Bob_Quantum_Channel: Initializing module QKDNetwork.Bob_Quantum_Channel, stage 0
QKDNetwork.DiagonalFilter: Initializing module QKDNetwork.DiagonalFilter, stage 0
QKDNetwork.HorizontalFilter: Initializing module QKDNetwork.HorizontalFilter, stage 0
QKDNetwork.QuantumStatesProcessorBob: Initializing module QKDNetwork.QuantumStatesProcessorBob, stage 0
QKDNetwork.QuantumStatesProcessorAlice: Initializing module QKDNetwork.QuantumStatesProcessorAlice, stage 0
** Event #1 t=0 QKDNetwork.QuantumStatesProcessorAlice (QKDProcessor, id=15) on 01000001 (omnetpp::cMessage, id=0)
** Event #2 t=0 QKDNetwork.FilterC (PolarizationFilter, id=8) on 0 (omnetpp::cMessage, id=2)
** Event #3 t=0 QKDNetwork.FilterB (PolarizationFilter, id=7) on 1 (omnetpp::cMessage, id=4)
** Event #4 t=0 QKDNetwork.FilterB (PolarizationFilter, id=7) on 0 (omnetpp::cMessage, id=6)
** Event #5 t=0 QKDNetwork.FilterD (PolarizationFilter, id=9) on 0 (omnetpp::cMessage, id=8)
** Event #6 t=0 QKDNetwork.FilterD (PolarizationFilter, id=9) on 0 (omnetpp::cMessage, id=10)
** Event #7 t=0 QKDNetwork.FilterC (PolarizationFilter, id=8) on 0 (omnetpp::cMessage, id=12)
** Event #8 t=0 QKDNetwork.FilterA (PolarizationFilter, id=6) on 0 (omnetpp::cMessage, id=14)
** Event #9 t=0 QKDNetwork.FilterD (PolarizationFilter, id=9) on 1 (omnetpp::cMessage, id=16)
** Event #10 t=0 QKDNetwork.Alice_Quantum_Channel (QKDChannel, id=10) on 0 (omnetpp::cMessage, id=2)
【问题讨论】:
-
能否展示模拟日志以及左侧模块发送消息的C++代码?此图仅显示消息发送的顺序,并不能证明中间模块在不同时间发送消息。
-
感谢您的回复 Jerzy,我用所需信息更新了问题。感谢您的帮助。
-
看起来A同时发送所有消息,B立即将它们发送给C。如果A和B(以及B和C)之间的所有链路都具有相同的延迟(或没有任何延迟),C 将同时接收所有消息。
-
感谢 Jerzy,它现在可以工作了 :)
标签: omnet++