2

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

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

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

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

4

2 回答 2

0

试试nmap。这里有https://pypi.python.org/pypi/python-nmappython-nmap满足您的需求

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

于 2013-06-17T10:01:32.407 回答
0

有趣的问题。然而:

  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模块。页面上的示例足以说明如何使用该模块。

于 2013-06-17T10:06:33.590 回答