所以我基本上有能力从多播环境中捕获一些数据包并将它们保存到文件中,然后将它们多播到需要多播数据的应用程序。我这样做是出于模拟目的。这是一个相对简单的工具,在将 10 甚至 50K 数据包重播到运行在 gdb 中的应用程序时,它非常有用。我的重播循环如下所示:
for (size_t i = 0; i < packets_.size(); ++i)
publisher_.publish(packets_[i].buf_, packets_[i].len_);
问题是,当 packet_.size() 大约为 100-200K 时(我永远不需要做更多的事情),当有人在听时,我似乎会遇到丢包。我猜这是因为它们是连续播放的。如果我尝试过这样的事情:
for (size_t i = 0; i < packets_.size(); ++i)
{
if (i % Y == 0) usleep(X);
publisher_.publish(packets_[i].buf_, packets_[i].len_);
}
对于不同的数量Y
和X
(如 1000/1000 和许多其他组合),但这不是很好。我的猜测是,如果我可以在非常短的时间内忙于每次迭代的咀嚼周期,我可以修补这个问题。忙着咀嚼,因为我不想屈服于其他进程,因此花费的时间比预期的要长,但时间非常短,甚至不到一毫秒,因为这需要等待 200 秒才能多播数据包。在循环中重复调用 sleep 函数似乎会让我大大减慢速度,这就是为什么我想知道旋转四分之一、五分之一、半毫秒左右(大约)的简单方法是什么?
或者是否有更好、更简单的方法来为这个用例打补丁?