Python 套接字 - 获取 LAN 连接的服务器主机名

Python Socket - getting lan connected server host names

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

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

您可能 运行 需要长时间的 DNS 或 SAMBA 查找(只是猜测)。它更像是一种网络相关行为,而不是 python。尝试 运行 你的带有分析器的脚本:python -m cProfile -s tottime lookup.py

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

我已经解决了我的问题,感谢 yan suggestion.It 大约需要 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