【问题标题】:Receiving local broadcast packet sent from a "supernet"接收从“超网”发送的本地广播数据包
【发布时间】:2011-04-14 02:24:49
【问题描述】:

我的问题是针对 C 语言的 Linux。

假设子网 /16 上的主机 A 正在发送广播 UDP 数据包。 (即通过广播到 xxx.xxx.255.255)

子网掩码 /24 的子网中的主机 B 有没有办法接收该广播?

我在主机 B 上的测试程序在正确的端口上等待,但如果 A 发送到 xxx.xxx.255.255,则不会收到任何内容。但是在使用 xxx.xxx.xxx.255 时会这样。

此外,我还有一些限制 1.我无法更改网络配置, 2. 在主机 A 上运行的旧程序也无法更改。

谢谢!

【问题讨论】:

  • 准确的说是收到发送到x.x.255.255的以太网帧,但是没有得到ip数据报
  • 我猜这就是 tcpdump 捕获它的原因?谢谢!我只是要深入到那个级别......
  • 以太网有源地址和目的地址字段。以太网上有一些保留地址,其中一个保留地址是“广播”……具体来说,目标以太网(即 Mac)地址中的所有 48 位都设置为 1。如果 NIC 看到广播,它将将数据包向上发送到主机的堆栈。当您的 IP 层看到此帧时,它会查看它是否在 IP 层被正确寻址...这就是您无法通过 UDP 接收它的原因...不匹配的子网会被 IP 层拒绝。

标签: c linux sockets broadcast subnet


【解决方案1】:

不,听起来您的网络配置不正确。

您不能有重叠的网络。要么您有一个 /16 网络,并且该 /16 内的 每个 主机都使用 255.255.0.0 作为网络掩码;或者您已将其分解为较小的网络,在这种情况下,每个较小的网络都有自己的网络掩码和广播地址。

【讨论】:

  • 它们在同一个网络上,但我猜正在广播的旧程序(我无法更改)正在使用 /16 上的广播地址发送。无论如何谢谢!
  • @kennyc:可能程序是很久以前编写的,当时仍在使用分类寻址。现在,您无法仅从网络地址推断广播地址,还需要网络掩码。
【解决方案2】:

尝试向计算机所在的子网广播。 x.x.?.255

例如

ip is 24.234.123.?
broadcast to 24.234.123.255

由于计算机被锁定到子网 /24,它只会被锁定到其范围内的 ip。

并且它的广播在它的范围内。

【讨论】:

  • 谢谢!对不起,我忘了说我无法更改当前正在播放的节目,也无法更改网络配置。
  • 听起来您需要网络上的另一台可以转播的服务器。
  • 或者您可以将网卡置于混杂模式,但如果您无法更改网络掩码,那么您可能无法将网卡置于混杂模式。
猜你喜欢
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
相关资源
最近更新 更多