问题摘要:AF_UNIX稳定发送,突发接收。
我有一个应用程序B,它通过unix域数据报套接字接收数据。有对等应用程序A向其发送数据。 A和B都在连续运行(并且是SCHED_FIFO)。我的应用程序A也打印接收时间。
对等应用程序B可以在不同的时间发送数据(仅以毫秒为单位)。理想情况下(我期望)数据包发送延迟应该与接收延迟完全匹配。例如:
A sends in time : 5ms 10ms 15ms 21ms 30ms 36ms
B should receive in time : 5+x ms 10+x ms 15+x ms 21+x ms ...
其中x是一个恒定的延迟。
但是当我实验我在B中观察到的是:
A sends in time : 5ms 10ms 15ms 21ms 30ms 36ms
B received in time : 5+w ms 10+x ms 15+y ms 21+z ms ...
(w,x,y,z是不同的常数延迟)。因此,我无法预测发送时间的接收时间。)
是因为unix域套接字中涉及一些缓冲吗?请为该问题建议一些解决方法,以便从发送时间开始预测接收时间。我需要1毫秒的精度。
(我使用的是vanilla Linux 3.0内核)
答案 0 :(得分:0)
当您使用阻塞recv()时,如果没有可用的数据报,您的程序将被取消预定。这对您的用例不利 - 您希望程序保持热度。所以让你的recv()非阻塞,并通过简单地等待来处理EAGAIN。这将占用一个核心的100%,但我认为您会发现它可以帮助您实现目标。