我正在编写一个实现RFC 2544网络测试的程序。作为测试的一部分,我必须以指定的速率发送UDP数据包。
例如,我应该以1Gb / s发送64字节数据包。这意味着我应该每0.5微秒发送一次UDP数据包。伪代码看起来像“Sending UDP packets at a specified rate”:
while (true) {
some_sleep (0.5);
Send_UDP();
}
但我担心Windows中没有some_sleep()
功能,而且Linux也可以给我0.5微秒的分辨率。
是否可以在C ++中执行此任务,如果是,那么正确的方法是什么?
答案 0 :(得分:2)
两种方法:
使用高分辨率计时器(例如Windows QueryPerformanceCounter
允许微小的速率变化,当你足够超出计算的速率时插入睡眠(1)。使用timeBeginPeriod获得1ms的分辨率。
对于这两种方法,你不能完全依赖睡眠。你需要保持总计数器,并在你前进/后退时调整睡眠时间。
答案 1 :(得分:1)
这可能会有所帮助,但我怀疑它可以直接移植到Windows以外的任何东西。约翰尼尔森Implement a Continuously Updating, High-Resolution Time Provider for Windows。
但是,请记住,对于较小的数据包,IP和UDP开销将占实际线上数据的很大一部分。这可能是你想要的,也可能不是。对RFC 2544的快速扫描表明允许更大的数据包;你可能会更好地走这条路。在每次Send_UDP()
通话之间持续延迟0.5微秒一直是困难的。
答案 2 :(得分:1)
要以线速传输64字节以太网帧,实际上您希望每672 ns发送一次。我认为唯一的办法就是让硬件变得非常友好。您将遇到PCI总线等带宽限制。系统调用发送一个数据包的时间将远远超过672 ns。睡眠功能是您最不担心的事情。
答案 3 :(得分:0)
你猜你应该能够使用Boost Asio
定时器功能。我自己没有尝试过,但我想deadline_timer
会boost::posix_time::nanosec
以及boost::posix_time::second
查看示例here
答案 4 :(得分:0)
Here's nanosleep
的本机Windows实现。如果GPL是可接受的,您可以重复使用代码,否则您将不得不重新实现。