【问题标题】:how to simulate time delay in network如何模拟网络中的时间延迟
【发布时间】:2015-10-29 09:27:34
【问题描述】:

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


编辑:

我的解决方法如下,对于Master端(客户端),

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()。我不确定这种方法是否适用。

【问题讨论】:

  • @EdHeal,不完全是。在这里,我问的是模拟客户端和服务器之间的时间延迟,但我没有问任何工具,如您发布的链接中的情况。基本上我正在寻找一个 C++ 伪。

标签: c++ delay simulation


【解决方案1】:

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

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

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

然后,在另一个线程中,等待数据报可用,然后休眠 max(target - now, 0)。睡眠后,发送数据报并继续下一个。如果队列为空,请等待。

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

记得同步访问队列。

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

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

【讨论】:

  • 非常感谢您的回答。从实际的角度来看,我仍然感到困惑。我添加了 C++ 伪代码来说明我的方法,但我不确定这是否足以解决这个问题。
猜你喜欢
  • 2014-01-04
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多