如何模拟网络中的时延
how to simulate time delay in network
假设我们需要在两台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 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()
。我不确定这种方法是否适用。
您可以在发送或接收时模拟延迟。一旦你以一种方式实现了它,另一种方式就应该微不足道了。我认为推迟派遣方是更自然的选择。这里有一种解决更普遍的网络延迟模拟问题的方法。关于只发送一个数据报的琐碎实验,请参阅最后一段。
如果你选择延迟发送,你可以做的是,而不是发送,将数据报和它应该发送的时间一起存储在队列中(目标=现在+延迟)。
然后,在另一个线程中,等待数据报可用,然后休眠max(target-now,0)。睡眠后,发送数据报,然后继续下一个数据报。如果队列为空,请等待。
若要模拟抖动,请随机化延迟。要让抖动模拟以非顺序发送数据报,请使用按目标发送时间排序的优先级队列。
请记住同步对队列的访问。
对于单个数据报,您可以做得简单得多。只需启动一个新线程,为延迟休眠,发送并结束线程。无需同步。这是一个c++代码:
std::thread([]{
std::this_thread::sleep_for(delay);
send("foo");
}).detach();
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- Active Directory:从网络服务帐户下运行的Windows服务调用ADsOpenObject时失败
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- 在处理网络、二进制数据和序列化时应使用流或容器
- 为什么我的程序在打开网络设备时遇到问题
- 使用 GetNetworkParams() 检索网络信息时出错
- 从网络数据包复制一串 wchar 时访问冲突
- 当代码已经输入curl_easy_perform()时,如何中止网络请求
- 在使用高架特权运行时,如何正确检测网络驱动器
- 如何在运行时调整DLIB神经网络隐藏层的大小
- 依赖于网络时的Qt测试
- 网络:当接口打开/关闭时,在所有接口上绑定套接字
- 如何在没有网络表条目上下文时删除 IP 地址
- 通过网络中的套接字进行文件传输时,该程序中的文件传输错误是什么
- 如何在从网络摄像头拍摄视频时加快IMediaControl::Run()
- 当在网络字节顺序中放置双精度时,为什么它是在 4 字节块中完成的
- 使用igraph C库生成具有幂律度分布的网络时的"excess elements in scalar initializer"
- 在实现特定的神经网络时,如何获得梯度表达式
- 如何模拟网络中的时延
- 低时延读取UDP端口