omnet ++ Ошибка в широковещательном сообщении от узла - PullRequest
1 голос
/ 11 июня 2019

Здравствуйте, я новичок в omnet ++.Я пытаюсь реализовать простой сервис вещания в omnet ++ без использования inet.У меня есть 6 узлов в кольцевой топологии.узел [0] является источником, а узел [3] является местом назначения.Таким образом, идея состоит в том, что узел [0] должен создавать сообщения и транслировать их через свои ворота, пока он не достигнет назначения, и удалить его, как только достигнет.

Я приложил свой код ниже.Я не уверен, есть ли здесь логическая ошибка, потому что я могу скомпилировать код.Также я не уверен, правильно ли я использовал msg-> getArrivalGateId () в моей функции forward, в идеале мне нужна функция 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 (): Невозможно отправить сообщение (MyMessage) Привет от 0 до 3, в данный момент оно находится в запланированных событиях, происходит между двумя модулями - в модуле(широковещательный) номер маршрута [0] (идентификатор = 2), при t = 0 с, событие # 1 errornap

1 Ответ

0 голосов
/ 12 июня 2019

gateId и gateIndex - это две совершенно разные вещи, и их не следует смешивать.Идентификатор является непрозрачным идентификатором, и вы не можете ничего с этим поделать.т.е. вы не должны добавлять, вычитать идентификаторы и предполагать, что это действительно.

Вы на правильном пути, что вы говорите, что должны использовать функцию getIndex.Как правило, индекс поступающего сообщения доступен как msg->getArrivalGate()->getIndex().А затем используйте метод send(msg, "gate$o", index) для отправки на определенные ворота.

...