gpt4 book ai didi

c++ - 如何模拟网络中的时延

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:38 24 4
gpt4 key购买 nike

假设我们需要在两台 PC AB 之间使用 UDP 协议(protocol)发送这条消息 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端(server),伪代码为

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

最佳答案

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

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

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

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

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

记得同步对队列的访问。

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

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

关于c++ - 如何模拟网络中的时延,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33410324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com