我正在尝试以最快的方式打印连接到我的网络的所有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更快?
答案 0 :(得分:0)
Ping是询问机器是否已声明IP地址的适当方式。它很慢,因为(取决于您的平台)ping超时通常是一秒钟。您可以通过减少超时或使用threading模块同时发送多个ping来加快速度。
您可以直接在python中实现ping:Pinging servers in Python
或者,使用nmap之类的工具。
答案 1 :(得分:0)
您可以与ping
:
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()
或者,使用ctypes在ping
方法中调用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.*")