Omnet ++ / INET: параметр, добавленный в cMessage, становится 0 при получении

В нашем моделировании мы добавили два поля в класс cMessage как защищенные:

/* sequence number for log files */
long seqNo = 0;

/* timestamp at sending message */
simtime_t sendingTime;

и мы добавляем следующие методы паблика

public:

  void setSeqNo(long n) {
    this->seqNo = n;
  }

  long getSeqNo() {
    return this->seqNo;
  }

  void setSentTime(simtime_t t) {
    this->sendingTime = t;
  }

  simtime_t getSentTime() {
    return this->sendingTime;
  }

Теперь, когда приложение, смоделированное сервером, запускается, перед каждой отправкой сообщения оно выполняет:

pkt->setSeqNo(numPkSent);
pkt->setSentTime(simTime());
fprintf(this->analyticsCorrespondentNode, "PKT %u SENT AT TIME %f TO NODE %s \n", numPkSent, pkt->getSentTime().dbl(), d->clientAddr.get4().str().c_str());

С другой стороны, когда сообщение получено смоделированным клиентом приложения, если выполняется:

double recvTime = simTime().dbl();
fprintf(this->analyticsMobileNode, "RECEIVED PKT num. %d SENT AT TIME: %f RECEIVED AT TIME %f TRANSMISSION TIME ELAPSED %f \n", msg->getSeqNo(), msg->getSentTime().dbl(), recvTime, recvTime - msg->getSentTime().dbl());

Проблема в том, что SeqNo правильно записывается клиентом, так как он был установлен сервером перед отправкой. Вместо этого методы

msg->getSentTime.dbl()

всегда возвращает 0 в файле журнала клиента, если он правильно установлен сервером в файле журнала сервера. Я не понимаю, почему, возможно, происходит что-то странное при преобразовании cMessage в cPacket в клиентском приложении ... вы это знаете?


person SagittariusA    schedule 16.07.2015    source источник


Ответы (2)


Чтобы добавить собственные поля в определение пакета, вы должны только подготовить определение в *.msg файле. Например файл FooPacket.msg:

packet FooPacket {
   long       seqNo;
   simtime_t sendingTime;
   // other fields... 
 }

Затем в исходном файле *.cc добавьте:
#include "FooPacket_m.h"
Класс FooPacket, производный от cPacket, а также все методы установки и получения будут автоматически сгенерированы во время компиляции - вы см. следующие файлы: FooPacket_m.h и FooPacket_m.cc.
Когда ваш клиент получает сообщение, вы должны проверить, соответствует ли его тип ожидаемому, а затем привести его к типу FooPacket. Например так:

void handleMessage(cMessage *msg) {
   if (dynamic_cast<FooPacket* >(msg)) {
      FooPacket *pkt = check_and_cast<FooPacket* >(msg);
      simtime_t t = pkt->getSendingTime();
   }
   // ...
}
person Jerzy D.    schedule 16.07.2015

Это может быть преобразование cMessage в cPacket. Вы пробовали это?

Packet pk = check_and_cast<Packet *>(msg);
pk->getSentTime.dbl();

Также вы можете попробовать проверить, есть ли где-нибудь проблема с simtime_t double, попробуйте double для параметра sentTime

person L. Jacob    schedule 16.07.2015
comment
Да, я уже пытался вызвать .dbl () раньше, как вы предлагаете, но ничего не изменилось. Я думаю, что попытаюсь прочитать simTime до того, как cMessage будет передан в cPacket, другими словами, до того, как макрос PK () будет вызван в cMessage (который содержит указанную вами инструкцию check_and_cas) - person SagittariusA; 16.07.2015