Python,获取所有LAN IP

时间:2013-07-07 16:05:33

标签: python windows networking ip lan

我正在尝试以最快的方式打印连接到我的网络的所有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更快?

4 个答案:

答案 0 :(得分:0)

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

您可以直接在python中实现ping:Pinging servers in Python

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

答案 1 :(得分:0)

您可以与ping

并行呼叫multiprocessing 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

答案 2 :(得分:0)

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

提示:ARP表OID = 1.3.6.1.2.1.4.22(ipNetToMediaTable)

获得该列表后,我会使用ICMP(ping)或任何其他响应协议对其进行双重检查。

答案 3 :(得分:-1)

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

>>> arping("192.168.1.*")