【问题标题】:Python, Getting All LAN IPsPython,获取所有 LAN IP
【发布时间】:2013-07-05 00:37:25
【问题描述】:

我正在尝试以最快的方式打印连接到我的网络的所有 Live IP。 我尝试在 for 循环中 ping,但速度很慢:

def PingTry(host):
    ping = subprocess.Popen(["ping", host], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    out, error = ping.communicate()
    print out #This will show me the ping result, I can check the content and see if the host replyed or not

正如我所说,它非常慢(我需要这样做 255 次)。

我尝试使用带有端口 80 的 TCP 连接来连接它:

import socket
IP = '192.168.1.100'
PORT = 80
tcpsoc = socket(AF_INET, SOCK_STREAM)
tcpsoc.listen(SOMAXCONN)
try:
    tcpsoc.bind(ADDR)
except Exception,ex:
    print "host is down!"

但是,它仍然不适用于此 IP,尽管它适用于路由器 IP

有没有办法更快地获取所有实时 IP?

【问题讨论】:

  • ping 慢的原因是您实际上是在等待来自界面的响应(pong)。您可以改为使用 arp -a 生成已连接接口的列表。
  • 我尝试使用arp -a,但我只在接口列表中获取了路由器的IP地址,虽然我的手机和我的笔记本电脑也已连接到网络
  • 您使用的是什么操作系统?你能确定你有超级用户(或至少CAP_NET_ADMIN)权限吗?
  • @phihag 我在 Windows 7 64 位上,是的,我有管理员权限。

标签: python windows networking ip lan


【解决方案1】:

Ping 是询问机器是否已申请 IP 地址的适当方式。它很慢,因为(取决于您的平台)ping 超时通常是一秒。您可以通过减少超时或使用threading 模块同时发送多个 ping 来加快速度。

你直接在python中实现一个ping:Pinging servers in Python

或者,使用nmap 之类的工具。

【讨论】:

  • 我不想使用程序来获取所有连接的 IP,我想在 Python 中这样做。在我问这个问题之前,我已经看过这个帖子了,尽管我将超时设置为 1 秒或 0.5 秒
【解决方案2】:

您可以同时调用pingmultiprocessing Pool

from multiprocessing.pool import ThreadPool

def ping(host):
    ping = subprocess.Popen(['ping', '-w', '500', host],
                            stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    out, error = ping.communicate()
    return (out, error)
addresses = ['192.168.0.1', '192.168.0.2',] # etc.
pool = Pool(10) # Increase number to increase speed and resource consumption
ping_results = pool.map(ping)
print(ping_results)

pool.close()
pool.join()

或者,使用ctypesping 方法中调用ICMPSendEcho

【讨论】:

    【解决方案3】:

    我会使用不同的方法,路由器通常在其 ARP 表中保存所有活动 IP 地址,假设这是一个专业网络并且任何基本的专业路由器都在回答 SNMP 请求,使用 Python 和一些 SNMP 包(如:PySNMP ) 并从中获取列表。

    提示:ARP 表 OID = 1.3.6.1.2.1.4.22 (ipNetToMediaTable)

    获得该列表后,我会使用 ICMP(ping) 或任何其他响应式协议仔细检查它。

    【讨论】:

      【解决方案4】:

      scapy provides a function。我不确定这是否是多线程的。如果没有,只需以多线程方式调用不同范围的函数即可。

      >>> arping("192.168.1.*")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 1970-01-01
        • 2022-10-12
        • 2018-08-18
        • 2020-06-24
        相关资源
        最近更新 更多