首页 > 解决方案 > omn​​et++ 从节点广播消息时出错

问题描述

您好,我是 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

标签: broadcastomnet++

解决方案


gateId 和 gateIndex 是两个完全不同的东西,不应该混用。ID 是一个不透明的标识符,你不能假设任何关于它的东西。即您不应该添加、减去 ID 并假设它是有效的。

你在正确的轨道上,你说你应该使用 getIndex 函数。通常,到达消息的索引是可用的msg->getArrivalGate()->getIndex()。然后使用该send(msg, "gate$o", index)方法发送到特定的门上。


推荐阅读