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

RPD*_*ies 7 python windows networking ip-address

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

我刚刚用Python和PyQt开始了一个新项目,我希望我的项目能够成为一台服务器,能够在其他计算机上与该服务器的其他实例进行通信.

所以,我需要获取计算机的IP地址和主机名.

首先,我考虑使用MSDOS"net view"命令,但这是在我的工作中尝试此命令之前,并且发现这可能需要大约15秒(我认为这太慢了).

我有这个想法:https://stackoverflow.com/a/15497083/1598891

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

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

另外,有没有办法只获得运行我的应用程序的计算机?(所以它会更快)

提前致谢

Pet*_*Bus 21

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

import socket

hostname = socket.gethostname()
IP = socket.gethostbyname(hostname)
Run Code Online (Sandbox Code Playgroud)


Pra*_*nde 5

如果你想获得运行python脚本的主机的IP地址,那么user2096338提供的答案就是你要去的地方.

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

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

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

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

希望这可以帮助