【问题标题】:force UDP broadcast via the network (disable loopback)通过网络强制 UDP 广播(禁用环回)
【发布时间】:2015-06-21 08:41:43
【问题描述】:

我想向网络上的多个设备发送 UDP 广播数据报,包括发送方设备本身。目标是让所有设备同时接收数据(嗯,+/- 5ms 是可以的)。

问题在于发送设备上的网络接口正在循环返回数据,因此它会立即被接收(与网络延迟发挥作用的其他设备相比——例如,对于 Wifi 来说相当多)

知道如何禁用我的网络接口以直接循环返回数据吗?

我的另一个想法:是否可以创建一个虚拟网络接口来发送广播数据包并在另一个仅通过网络接收它的接口上侦听?

我试图在 Linux 机器上用 C 语言来做这件事。任何帮助将不胜感激!

【问题讨论】:

  • 我认为您误解了网络的工作方式。您不能向自己发送消息,让它在电缆/空中等待 X 毫秒,然后再回来。您是否想要一些目标框/路由器将消息回显给您?你想要某种延迟的环回接口吗?
  • 广播/多播数据包实际上并未发送。它们总是在接口的输入队列中排回队列,因此您总是可以在远程站点之前获取它们。顺便说一句,您不能在完全相同的地方接收数据包,因为它们在不同的地方,并且您必须考虑传输延迟、桥接、路由和其他一些可能延迟交付的因素。为什么你认为 5ms 可以,而不是 0.5s?网络带宽从 bps 到 Gbps(现在甚至是 Tbps)不等。
  • 更好地解释你的真正问题是什么,而不是你脑子里有什么计划解决方案。
  • 我想在多台设备上开始完美同步的音频播放。我当前的解决方案确保所有接收器都有足够的缓冲数据,并且我“只”需要一个开始命令来同时在任何地方接收。超过 10 毫秒会导致回声。 NTP 对我不起作用,因为目标设备上的时钟不够精确(硬件便宜)。

标签: c linux networking udp broadcast


【解决方案1】:

UDP 作为 IP 负载发送。 IP数据包的路由是IP栈的一个域。它决定如何将数据包传输到目的地。当您的 IP 堆栈检测到目标是本地主机时,它会将数据包排入接收队列,并且该数据包将立即可用。如果您的适配器的发送队列已满,您将有延迟。所以你不能与这个概念同步。

如果您需要硬同步,则应使用 NTP 或 SNTP tro 同步时钟并为所需的常用操作定义注释开始时间。

编辑: (S)NTP 协议设计为毫秒级同步。由于上述原因,您将获得任何 UDP 数据包传输都无法达到的精度。

【讨论】:

  • 在 linux 中,使用 NTP 同步时钟并选择合适的纪元以在多台机器上同时开始某些进程更为可行。
  • NTP 在我的情况下不起作用。目标设备上的时钟不够精确(旧且便宜的硬件)。我需要在
  • @Daniel 您能否详细说明“不精确”的含义。是不是晶体频率不对,是不是频率不稳定? 32768kHz晶体通常比PC和微控制器的高频晶体具有更好的精度。
  • @harper 请求当前时间返回一个非常精确的值,但它似乎只每 10 毫秒更新一次。此外,时钟相对较快地不同步......
  • 如果您对 10ms 的 NTP 更新间隔有疑问,您希望多久发送一次 UDP 同步数据包?您的晶体必须足以将相位保持几毫秒,否则 ypu 应考虑使用不同的硬件。
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2018-01-16
  • 1970-01-01
  • 2017-02-18
  • 2014-05-16
相关资源
最近更新 更多