如何在Windows上以C ++的指定速率发送UDP数据包?

时间:2011-02-21 14:31:51

标签: c++ networking udp

我正在编写一个实现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 ++中执行此任务,如果是,那么正确的方法是什么?

5 个答案:

答案 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_timerboost::posix_time::nanosec以及boost::posix_time::second

查看示例here

答案 4 :(得分:0)

Here's nanosleep的本机Windows实现。如果GPL是可接受的,您可以重复使用代码,否则您将不得不重新实现。