我正在尝试获取LAN连接的服务器的主机名,因此我可以使用主机名在这些服务器上运行查询:
import socket
IP_RANGE = 10
hostNamesList = []
socket.setdefaulttimeout(0.1)
for i in range(IP_RANGE):
try:
hostNamesList.append(socket.gethostbyaddr("192.168.1.%s" % i)[0])
except:
pass
print hostNamesList
即使我将超时设置为0.1秒,上述代码也需要花费几分钟来扫描选定的IP范围。
我做错了什么吗,或者有什么方法可以更快地获取主机名?
答案 0 :(得分:0)
您可能会遇到长时间的DNS或SAMBA查找(只是一个猜测)。它更多是与网络相关的行为,而不是python。尝试使用探查器运行脚本:python -m cProfile -s tottime lookup.py
如果我的猜测是正确的,那么您会发现_socket.gethostbyaddr
时间较长,那么唯一的好选择是尝试并行处理您的代码(或改进网络设置以缩短查找时间)。
答案 1 :(得分:0)
我得到了yan的建议,解决了我的问题。它只需10秒钟而不是几分钟的时间
import socket
from threading import Thread
hostNamesList=[]
def searchForSingleIP(i):
try:
hostNamesList.append(socket.gethostbyaddr("192.168.1.%s" % str(i) )[0])
except:
pass
for i in range(256):
worker = Thread(target = searchForSingleIP, args = (i,))
worker.start()
worker.join(timeout=0.05)
print hostNamesList