1

我正在尝试获取 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

上面的代码需要几分钟来扫描选定的 IP 范围,即使我将超时设置为 0.1 秒。

我做错了什么,或者有什么方法可以更快地获取主机名吗?

4

2 回答 2

2

感谢 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
于 2018-12-06T08:44:38.597 回答
0

您可能会遇到冗长的 DNS 或 SAMBA 查找(只是猜测)。它更多的是与网络相关的行为,而不是 python。尝试使用探查器运行您的脚本:python -m cProfile -s tottime lookup.py

如果我的猜测是正确的,您会看到很长的_socket.gethostbyaddr时间,那么唯一好的选择是尝试并行您的代码(或改进网络设置以获得更好的查找时间)。

于 2018-12-05T14:07:52.460 回答