问题描述
我需要修改UdpEchoApp(来自Inet包),以便在它发送回数据包之前,它等待“ x”秒的仿真时间。我尝试做类似的事情:
simtime_t before;
//something to calculate
simtime_t after;
if (after-before > x) {continue}
else {do something and then recalculate after}
但是这使Qtenv崩溃。有什么我可以解决的问题吗? 我还发布了发送回接收到的数据包的函数:
void UdpEchoApp::socketDataArrived(UdpSocket *socket,Packet *pk)
{
// determine its source address/port
L3Address remoteAddress = pk->getTag<L3AddressInd>()->getSrcAddress();
int srcPort = pk->getTag<L4PortInd>()->getSrcPort();
pk->clearTags();
pk->trim();
// statistics
numEchoed++;
emit(packetSentSignal,pk);
// send back
socket->sendTo(pk,remoteAddress,srcPort);
}
谢谢
解决方法
您的代码有误:模拟环境会根据传入事件增加模拟时间。换句话说,可以在定义模块行为的标准方法外部之外修改仿真时间。
要在模拟过程中模拟延迟,必须使用自消息。
简而言之:
- 在
socketDataArrived()
中:
- 记住要发送的数据包,并将
remoteAddress
留在缓冲区中, - 在
x
秒后安排一次自我消息(使用scheduleAt()
)。
- 在
handleMessageWhenUp()
中,当发生自我消息传递时,从缓冲区中取出数据包并发送。