繁体   English   中英

UDP 广播地址 127.255.255.255

[英]UDP Broadcast Address 127.255.255.255

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

1)这有什么特别之处

   127.*.*.*` network?

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

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

  1. 127.0.0.0/8是一个特殊的地址块,它是为回环到同一台机器而保留的,它永远不应该是真实网络接口的地址。 特别是, 127.0.0.1是默认的localhost地址(查看 Unix 机器上的lo0接口)。

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

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

查看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 地址。 通常是一个 IP,例如 192.168.1.255。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM