Unix域套接字:使延迟不变

时间:2013-06-27 12:39:28

标签: c linux sockets datagram unix-socket

问题摘要: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内核)

1 个答案:

答案 0 :(得分:0)

当您使用阻塞recv()时,如果没有可用的数据报,您的程序将被取消预定。这对您的用例不利 - 您希望程序保持热度。所以让你的recv()非阻塞,并通过简单地等待来处理EAGAIN。这将占用一个核心的100%,但我认为您会发现它可以帮助您实现目标。