【问题标题】:Sending broadcast to all networks向所有网络发送广播
【发布时间】:2013-06-13 04:20:57
【问题描述】:

我目前正在编写一个 python 程序,该程序需要在 LAN 上发现其自身的其他实例。它使用 UDP 广播进行发现 (255.255.255.255)。

问题在于,如果计算机有多个网络适配器(连接到多个网络),那么只有其中一个网络会接收到广播。我最初的想法是枚举分配给本地网络的所有网络地址,并为每个地址发送一个广播数据包(例如192.168.0.255192.168.1.255)。但是,似乎没有可靠的方法来检测所有本地网络地址,因为我发现和尝试的所有内容要么依赖于 python-2-only 库,要么在我的 linux 虚拟机上仅返回 127.0.1.1(其中有 192.168.0.100 和一些其他)。

在这种情况下如何向所有可用网络广播?

我正在使用 Python 3,并且正在寻找独立于平台的方法,并且没有大型第三方库。 correctly 显示所有网络接口的库可以完成这项工作。

【问题讨论】:

  • 抱歉,我不知道有任何 Python 库可以为您执行此操作。值得一提的是:在 Windows 上,您可以解析 ipconfig /all 的输出,在 Linux 上查看 ip addrip link
  • 您能给出的最糟糕的建议。有用于工作的模块。始终避免启动外部命令 - 这是不好的做法。
  • 如果你向255.255.255.255发送一个UDP数据包,默认情况下它应该被发送到所有网络接口,尽管在Windows中应该有some issues的实现。
  • 如果您找不到工作的跨平台库,您可以使用ctypes 直接点击getifaddrs(3)GetIpAddrTable()(取决于平台)。另请参阅this forum thread

标签: python networking python-3.x udp broadcast


【解决方案1】:

有趣的问题。然而:

  1. 在您将应用程序安装在每个节点上之前,不要期望网络中的每台计算机都能得到响应。出于安全原因,在某些类型的设备和系统中禁止回复广播。
  2. 您可以尝试以下代码获取本地地址:

    import socket
    myips = socket.gethostbyname_ex(socket.gethostname())[2]
    [ip for ip in myips if not ip.startswith("127.")][:1]
    

    检测为该 IP 设置的网络掩码的问题仍然存在。

  3. 也可以使用 pypi 上提供的 netifaces 模块。页面上的示例足以说明如何使用该模块。

【讨论】:

  • 感谢您的回答。 1. 我知道,我的应用程序会监听广播并做出响应。问题是发送那些。 2. 问题是这个在我的 linux 虚拟机上不能正常工作。即使 iptables 正确显示 192.168.0.100 ,它也只返回一个不相关的 ['127.0.1.1'] 。 3. netifaces 似乎是一个仅限 python-2 的库。
  • 我认为代码足够简单,可以将其更正为 Python 3。它在内部使用标准系统调用。
  • 我找到了一个端口,但它没有安装在 Windows 上,因为有 C 代码需要编译等...
  • 我希望我的程序尽可能便携。要求在每个客户端上安装编译器不是我的意图。
  • 请模块作者为 Windows 的 Python 3 提供二进制文件。
【解决方案2】:

试试nmappython-nmap 这里有https://pypi.python.org/pypi/python-nmap 供您使用

注意:0.2.7 版本号适用于python-nmap,而不是 python 本身,因此它适用于 python3)。

【讨论】:

  • 可以完成这项工作,但这就像推出一辆坦克杀死一只苍蝇:-)
  • 我真的不想做端口扫描,只是想向所有可用网络发送广播。
猜你喜欢
  • 2010-10-01
  • 2015-07-31
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多