omn​​et ++从节点广播消息时发生错误

时间:2019-06-11 16:44:01

标签: broadcast omnet++

您好,我是omnet ++的新手。我正在尝试在omnet ++中实现简单的广播服务,而不使用inet。我在环形拓扑中有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](广播,id = 2)在selfmsg上,您好,从0到3,(MyMessage,id = 0)

send()/ sendDelayed():无法从0到3发送消息(MyMessage),您好,它当前处于计划事件中,正在两个模块之间进行-在模块(广播)routing.node中[0](id = 2),在t = 0时,事件#1 errorsnap

1 个答案:

答案 0 :(得分:0)

gateId和gateIndex是两个完全不同的东西,不应混用。该ID是不透明的标识符,您不能承担任何责任。也就是说,您不应添加,减去ID并假定其有效。

您说对了,您应该使用getIndex函数。通常,到达消息的索引可作为msg->getArrivalGate()->getIndex()使用。然后使用send(msg, "gate$o", index)方法发送特定的门。