Python Socket-获取局域网连接的服务器主机名

时间:2018-12-05 13:04:40

标签: python sockets hostname gethostbyaddr

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

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

2 个答案:

答案 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