Omnet ++ / INET:添加到cMessage的参数在收到时变为0

时间:2015-07-16 09:20:33

标签: simulation omnet++ inet

在我们的模拟中,我们将两个字段添加到cMessage类作为protected:

/* 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是由客户端正确编写的,因为服务器在发送之前已经设置了SeqNo。相反,方法

msg->getSentTime.dbl()

在客户端日志文件中始终返回0,而服务器日志文件中的服务器正确设置了该文件。我不明白为什么,也许在客户端应用程序中cMessage到cPacket之间的转换中发生了一些奇怪的事情......你知道吗?

2 个答案:

答案 0 :(得分:2)

为了将自己的字段添加到数据包定义中,您应该*.msg文件中准备定义。例如文件FooPacket.msg

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

然后,在源文件*.cc中添加:
#include "FooPacket_m.h"
在编译期间,将自动生成<{1}}以及所有setter和getter方法的类FooPacket - 您将看到以下文件:cPacketFooPacket_m.h
当您的客户端收到消息时,您应该检查该类型是否与您预期的相同,然后将其转换为FooPacket_m.cc类型。例如这样:

FooPacket

答案 1 :(得分:1)

可能是从cMessage到cPacket的转换。你试过这个吗?

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

此外,您可以尝试检查simtime_t double某处是否存在问题,针对double参数尝试sentTime