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

时间:2013-10-28 14:02:17

标签: 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可能是一个缓慢的操作?

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

提前致谢

2 个答案:

答案 0 :(得分:20)

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

import socket

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

答案 1 :(得分:5)

如果您想获取运行python脚本的主机的IP地址,那么 user2096338 提供的答案就是您的选择。

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

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

  1. 每当您在主机上安装服务器时,请将自身注册到中央数据库,然后可以通过新服务实例查询该数据库以识别运行对等服务器的所有计算机
  2. 使用WMI(因为您在Windows上)查询在对等系统上运行的所有进程,并检查您的服务器进程是否是其中之一。
  3. 您的服务器将保持探测端口打开,并且新服务器安装将在该探测端口上针对网络中的每个主机ping服务器。如果它得到响应,那么这台计算机正在运行服务器进程。
  4. 在我看来,方法1是最安全和最便携的,因为它可以防止打开不必要的端口(如方法3),这些端口是安全漏洞(取决于你的python脚本运行的上下文)。它也不依赖于远程主机上WMI服务的可用性(某些系统可能禁用了WMI)。

    希望这有帮助