如何模拟网络中的时间延迟

时间:2015-10-29 09:27:35

标签: c++ delay simulation

让我们说我们需要在两台PC A B 之间使用UDP协议发送此消息Hellow World。计算机 A 会将消息发送到 B 并延迟一段时间(常量或时变)。现在要模拟这种情况,我的第一次尝试是使用sleep函数,但此解决方案将冻结整个应用程序。另一种解决方案是实现mutlithreads并使用sleep()与负责获取数据的线程并将其存储在全局变量中并从另一个线程访问此变量。在该解决方案中,线程之间的同步可能存在困难。为了解决这个问题,我将把接收到的数据写入txt文件并从另一个线程中读取。 我的问题是进行这项琐碎实验的正确方法是什么?如果答案有一些C ++伪,我将不胜感激。

编辑:

我尝试解决它的方法如下,对于主方(客户),

Master masterObj
int main()
{
    masterObj.initialize();
    masterObj.connect();

    while( masterObj.isConnected() == true ){
        get currentTime and data; // currentTime here is sendTime
        datagram = currentTime + data;
        masterObj.send( datagram );
    }
}

对于Slave端(服务器),伪代码是

Slave  slaveObj
int main()
{
    slaveObj.initialize();
    slaveObj.connect();
    slaveObj.slaveThreadInit();

    while( slaveObj.isConnected() == true ){
        slaveObj.getData();
    }
}

Slave::recieve()
{
    get currentTime and call it recievedTime
    get datagram from Master;
    this->slaveThread( recievedTime + datagram );   
}

Slave::slaveThread( info )
{
    sleep( 1 msec );
    info = recievedTime + datagram ;
    get time delay;
        time delay = sendTime - recievedTime;
    extract data from datagram; 
    insert data and time delay in txt file ( call it txtSlaveData);
}

Slave::getData()
{
    read from txtSlaveData;
}

正如您所看到的,我正在使用其中的独立主题,我使用sleep()。我不确定这种方法是否适用。

1 个答案:

答案 0 :(得分:0)

模拟从一台计算机向另一台计算机发送UDP数据报的一种简单方法是将数据报通过环回接口发送到同一台计算机上的另一台(或相同)进程。除了延迟之外,这将完全像真实的东西。

您可以在发送或接收时模拟延迟。一旦你以一种方式实现它,另一种应该是微不足道的。我认为推迟发送方是更自然的选择。这是一种模拟网络延迟的更普遍问题的方法。请参阅最后一段,了解仅发送一个数据报的简单实验。

如果您选择延迟发送,您可以做的是,而不是发送,将数据报存储在队列中,以及应该发送的时间(目标=现在+延迟)。

然后,在另一个线程中,等待数据报变为可用,然后睡眠为max(目标 - 现在,0)。睡觉后,发送数据报并继续下一个。等待队列为空。

要模拟抖动,请将延迟随机化。要让抖动模拟以非连续顺序发送数据报,请使用按目标发送时间排序的优先级队列。

请记住同步对队列的访问权限。

对于单个数据报,您可以做得更简单。只需启动一个新线程,为延迟休眠,发送和结束线程。无需同步。这是c ++代码:

std::thread([]{
    std::this_thread::sleep_for(delay);
    send("foo");
}).detach();