3

问题总结:AF_UNIX稳定发送,突发接收。

我有一个通过 unix 域数据报套接字接收数据的应用程序 B。有一个对等应用程序 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 内核)

4

1 回答 1

1

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

于 2013-06-27T13:24:49.190 回答