在我们的模拟中,我们将两个字段添加到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之间的转换中发生了一些奇怪的事情......你知道吗?
答案 0 :(得分:2)
为了将自己的字段添加到数据包定义中,您应该仅在*.msg
文件中准备定义。例如文件FooPacket.msg
:
packet FooPacket {
long seqNo;
simtime_t sendingTime;
// other fields...
}
然后,在源文件*.cc
中添加:
#include "FooPacket_m.h"
在编译期间,将自动生成<{1}}以及所有setter和getter方法的类FooPacket
- 您将看到以下文件:cPacket
和FooPacket_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