【问题标题】:cannot receive UDP broadcast packets无法接收 UDP 广播数据包
【发布时间】:2011-03-02 10:47:54
【问题描述】:

我有 2 个盒子: - 我称之为“Omap”的嵌入式设备(带有 linux 的 ARM Omap)。 - PC(可以是 Windows 或 linux)。

场景 1

两个盒子都在同一个网络中(例如:我的办公室)。
Omap 从 DHCP 服务器获取其地址(例如:192.168.10.110)。 PC 始终具有相同的地址(例如 192.168.10.104)。
我可以在任何端口上成功交换 UDP 广播数据包。
成功。


场景 2

这两个盒子位于没有 DHCP 服务器的网络中。
PC 有一个静态 IP 地址(例如:10.10.10.20)。
Omap 启动,寻找 DHCP 服务器,但没有找到,并且处于我所说的“错误 IP 地址”状态。
现在...广播 UDP 数据包来自 Omap 工作:PC 可以看到它们。
反之则不行:Omap 看不到 PC 广播的 UDP 数据包。 我在另一台 PC 上使用 Wireshark 来验证数据包是否正在发送。
失败。

我尝试更改 Omap ip 地址(使用 ifconfig)...没有运气。

我错过了什么?

为了完成图片,当 Omap 在场景 2 中时,如果我运行 udhcpc ...它可以与 DHCP 服务器通信并获取 IP 地址。我还看到了 Wireshark 的数据包。 所以这意味着 DHCP 客户端能够广播 UDP 数据包。 (是的,我尝试使用 DHCP 端口 67/68,但它不起作用)。

我正在使用 Boost C++ Asio UDP 套接字。具体来说,我拿了多播示例并将它们更改为广播。

感谢任何帮助。

谢谢, 贝内代托

PS:一些澄清。

Omap 设备是一种嵌入式设备,我的目标是客户不必在现场设置其 IP 地址。这就是为什么我要与 PC 交换广播数据包,以从我在 PC 上运行的其他软件获取“好的”IP 地址(即使在具有静态 IP 地址且没有 DHCP 服务器的网络中,它也知道当前子网是什么)。

基本上我实现了一个非常简单的 DHCP 协议。 PC 可以收听 Omap 广播的数据包,反之则不行。

【问题讨论】:

  • Omap 如何在没有 IP 地址的情况下发送 UDP 广播?可能是在 Omap 上没有配置 IP 地址的网络堆栈只会丢弃所有传入的 IP 数据包。
  • “我尝试更改 Omap ip 地址(使用 ifconfig)...没有运气。”你做了ifconfig ethXX up吗?接口必须启动。

标签: c++ udp ip-address broadcast


【解决方案1】:

一些想法......

1) ifconfig eth0 -- 接口是否启动,是否有 IP 地址、合适的网络掩码等?

2) 路由——配置是否正确? (Netstat -r 或路由)(如果 IP 地址位于不同的未路由子网上,这可能是一个问题,具体取决于网络掩码。)

3) 防火墙——我无法告诉你我遇到防火墙问题的次数。验证它没有在那里停止。

4) 直接在各自的系统上尝试 tcpdump——它显示了什么?经历了什么?

5) 您可以从一个系统 ping 到另一个系统吗? (ICMP 的规则可能与 UDP 不同。)

(我敢打赌,接口关闭,不同的子网被网络掩码阻塞,或者首先没有到主机的路由问题。)

【讨论】:

  • 1) 接口已启动。 2) netstat -r Destination Gateway Genmask Flags MSS Window irtt Iface 10.0.0.0 * 255.0.0.0 U 0 0 0 eth0 3) 我认为没有防火墙。
    4) 我在 Omap 上尝试了 socat:没有看到数据包。电脑可以。 5) Ping 给出“网络不可达”。
【解决方案2】:

如果您使用ifconfig 设置 IP 地址,这可能还不够。通常,您还必须配置路由表,这通常包括添加两条路由:一条表示“此网络连接在eth0”,一条表示“这是默认网关”。 (后者不是严格要求。)

“网络无法访问” - 我假设您尝试从 OMap ping PC?如果你的电脑是192.something.something.something,并且你的“OMap”有路由表你的评论:

Destination  Gateway  Genmask    Flags  MSS  Window  irtt  Iface
10.0.0.0     *        255.0.0.0  U      0    0       0     eth0

...那么它将无法发送。该路由表仅在您尝试将内容发送到10.something 时才起作用:这是它知道的唯一路由。如果您没有运行10.0.0.0/8 网络,那么该路由是错误的。

如果您想这样做,请查找有关路由表、IP 地址等的一些材料。虽然,如果您只想让普通人“插入”——他们将运行 DHCP——那有什么问题呢?您不能在没有某种形式的中介的情况下仅在网络上选择一个 IP 地址:要么是人工中介,要么手动设置它,或者您使用 DHCP 服务器之类的东西。否则,您可能会选择其他人的地址。此外,您需要知道您是在 10.0.0.0/8 网络、192.168.0-255.0/8 网络、其他 LAN 还是 Internet...DHCP 为您做的事情...

【讨论】:

  • 谢谢塔纳托斯。我对子网和路由知之甚少......(您可能已经理解)但我意识到路由表看起来不够用。我不能提供更多细节,但在许多情况下不会有 DHCP 服务器。如果 DHCP 客户端可以从 10.0.0.0/8 网络发送和接收广播消息……我的软件也可以。在 DHCP 客户端代码中挖掘一点,我发现它使用原始套接字。这似乎是一个可行的解决方案。又是一声!
猜你喜欢
  • 2018-08-19
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2019-05-12
相关资源
最近更新 更多