【问题标题】:UDP Broadcast Address 127.255.255.255UDP 广播地址 127.255.255.255
【发布时间】:2013-09-21 16:18:05
【问题描述】:

我看到有人说 UDPSocket 广播到 127.255.255.255。

1)这有什么特别的

   127.*.*.*` network?

2)如果我的客户端系统不在此 127.*.*.* 网络中并且我不知道它们在哪个网络上,那么我应该使用什么广播地址以便客户端可以接收消息。

3)在UDP广播期间,我猜Server地址不重要,因为它是无连接传输?

【问题讨论】:

    标签: networking udp


    【解决方案1】:
    1. 127.0.0.0/8 是一个特殊的地址块,保留用于环回同一台机器,它不应该是真实网络接口的地址。特别是,127.0.0.1 是默认的 localhost 地址(查看 Unix 机器上的 lo0 接口)。

    2. 您不应该在 127/8 网络中拥有客户端系统。我不认为127.255.255.255 可以发送到网络,它应该只用于发送到本地机器。

    3. 如有必要,客户端在收到响应时可以获取服务器地址。然后它可以使用它与该服务器保持通信。

    【讨论】:

    • on 3,CLient如何通过程序找到服务器地址?
    • 关于2,如果服务器不知道客户端在哪个网络,那么就没有办法发出广播消息客户端可以接收?
    • 您只能将广播发送到您的本地网络,因此客户端必须在同一网络上。您获取 NIC 的地址,并使用子网掩码计算广播地址,然后发送到该地址。
    • 您也可以使用 255.255.255.255 向本地网络发送广播而无需经过。
    • 警告广播到 255.255.255.255 几乎无法正常工作,因为大多数硬件/软件都放弃了这一点,最好广播到更具体的子网,例如192.168.255.255.
    【解决方案2】:

    查看ip address 的输出,我得到以下信息:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether ac:1f:6b:78:27:42 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.1/24 brd 192.168.1.255 scope global eno1
           valid_lft forever preferred_lft forever
    

    如我们所见,lo 不包含 BROADCAST 标志,因此您无法在该地址(网络)上广播。

    关于如何确定地址,我建议你提供一个配置文件,管理员可以在其中输入他想用来广播的IP。干净多了,我想。但是,如果您想以编程方式查找接口列表,则可以使用if_...() 函数获取附加到每个接口的 IP 地址。跳过lo(好吧,跳过任何没有设置BROADCAST标志的接口)。

    对于如何做到这一点,我编写了libaddr,这是一个显示如何列出接口的 C++ 库。从那里您可以使用界面中的信息。您在 /usr/include/... 文件夹中找到的文档和结构并不太复杂。许多工具使用该功能来监听您的计算机可用的所有网络。不过,这可能是一个安全问题。

    不过,对于广播,您有多种可能性。

    1. 发送到支持BROADCAST的接口,并使用该接口的广播IP地址。通常是 192.168.1.255 等 IP。

    2. 发送到255.255.255.255,真的很丑很危险。它绝对会无处不在。

    3. 发送到 224.x.x.x IP 地址。但是,此类 IP 可能会导致问题,因为它们的行为方式类似于 255.255.255.255(即消息被发送到任何地方)。话虽如此,智能交换机可以检查哪台计算机当前正在侦听这些 IP 地址,从而控制向哪台计算机发送 UDP 数据包。如果你可以这样设置,那就是……对我来说,智能开关仍然只是理论。

    我有处理所有这些情况的eventdispatcher C++ library。 UDP 的代码可以在几个以udp_... 开头的文件中找到,因此它应该很容易复制和粘贴。如果你想使用这个库,它会有点复杂,因为它有依赖项(所有都可以在 Snap!C++ 项目中找到,所以你可以递归地 git clone ......关于如何做所有这些的信息在主 README.md)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 2021-04-12
      • 1970-01-01
      • 2011-02-28
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多