【发布时间】:2019-10-26 03:33:45
【问题描述】:
您好,我是 omnet++ 的新手。我正在尝试在不使用 inet 的情况下在 omnet++ 中实现一个简单的广播服务。我在环形拓扑中有 6 个节点。 node[0] 是源,node[3] 是目的地。所以这个想法是 node[0] 应该创建消息并通过它的门广播它们,直到它到达目的地并在到达目的地后将其删除。
我在下面附上了我的代码。我不确定这里是否存在逻辑错误,因为我可以编译代码。另外我不确定我是否在我的转发函数中正确使用了 msg->getArrivalGateId(),理想情况下我需要 getIndex() 函数。请让我知道我该如何解决这个问题。感谢您提供任何反馈。
void broadcast::initialize()
{
if (getIndex() == 0) {
MyMessage *msg = generateMessage();
scheduleAt(0.0, msg);
}
}
MyMessage *broadcast::generateMessage()
{
// Produce source and destination addresses.
int source = getIndex(); // our module index
//int n = getVectorSize(); // module vector size
int destination = (3);
int hopcount = 3;
char msgname[20];
sprintf(msgname, "Hello from-%d-to-%d, ", source, destination);
// Create message object and set source and destination field.
MyMessage *msg = new MyMessage(msgname);
msg->setSource(source);
msg->setDestination(destination);
msg->setHopcount(hopcount);
return msg;
}
void broadcast::handleMessage(cMessage *msg)
{
MyMessage *bmsg = check_and_cast<MyMessage *>(msg);
if (bmsg->getDestination() == getIndex()) {
delete bmsg;
// Generate another one.
EV << "Generating another message: ";
MyMessage *bmsg = generateMessage();
EV << bmsg << endl;
forwardMessage(bmsg);
}
else {
forwardMessage(bmsg);
}
}
void broadcast::forwardMessage(MyMessage *msg)
{
// Increment hop count.
// msg->setHopcount(msg->getHopcount()+1);
int size = gateSize("gate");
int baseId = gateBaseId("gate$o");
for (int i = 0; i < size; i++){
if(i != msg->getArrivalGateId()) {
EV << "Forwarding message " << msg ;
send(msg, baseId+i);
}
}
}
** 事件 #1 t=0 routing.node[0] (broadcast, id=2) on selfmsg Hello from-0-to-3, (MyMessage, id=0)
send()/sendDelayed(): Cannot send message (MyMessage)Hello from-0-to-3, ,它目前处于预定事件中,正在两个模块之间进行——在模块(广播)routing.node [0] (id=2),在 t=0s,事件 #1 errorsnap
【问题讨论】: