Python - 在运行同一应用程序的网络上获取计算机的 IP 地址和主机名



需要明确的是:我2周前刚开始使用Python,但我是一名C#,ASP,PHP,JavaScript开发人员。

我刚刚用Python和PyQt启动了一个新项目,我希望我的项目是一个能够与其他计算机上该服务器的其他实例进行通信的服务器。

因此,我需要获取计算机IP地址和主机名。

首先,我想过使用 MSDOS"网络视图"命令,但这是在我的工作中尝试这个命令之前,看到这可能需要大约 ~15 秒(我认为这太慢了)。

我的想法来自: https://stackoverflow.com/a/15497083/1598891

此外,"net view"命令可以返回不再在网络上的计算机,并在尝试按主机名获取其 IP 地址时导致异常(每次无法访问计算机时,这也会减慢该过程)。

我的问题:有没有办法在本地网络上获取所有计算机的IP和主机名,而无需在Windows上传递net view net view因为这可能是一个缓慢的操作?

另外,有没有办法只让运行我的应用程序的计算机?(这样会更快)

提前致谢

对于本地主机的主机名和 ip,您可以使用套接字模块和 gethostname,以及 gethostbyname 方法:

import socket
hostname = socket.gethostname()
IP = socket.gethostbyname(hostname)

如果你想获取运行python脚本的主机的IP地址,那么user2096338提供的答案就是你要走的路。

为了发现局域网内网络上的所有计算机,您可以使用scapy。 https://github.com/bwaldvogel/neighbourhood/blob/master/neighbourhood.py 是我在浏览类似的SO问题时发现的链接;它发现网络(LAN)中的所有计算机。

如果要确保上述脚本仅返回运行服务器的计算机 - 则有多种方法可以执行此操作,下面按可移植性顺序列出

  1. 每当在主机上安装服务器时,都会将自身注册到中央数据库中,然后可以通过服务的新实例查询该数据库,以识别运行对等服务器的所有计算机
  2. 使用 WMI(因为您在 Windows 上)查询在对等系统上运行的所有进程,并检查您的服务器进程是否是其中之一。
  3. 您的服务器将
  4. 保持探测端口打开,并且新的服务器安装将 ping 到网络中每个主机的此探测端口上的服务器。如果它得到响应,则此计算机正在运行服务器进程。

在我看来,方法 1 是最安全和可移植的,因为它可以防止打开不必要的端口(如方法 3),这些端口是安全漏洞(取决于您的 python 脚本运行的上下文)。它也不依赖于远程主机上 WMI 服务的可用性(某些系统可能禁用了 WMI)。

希望这有帮助

最新更新