Python Socket - получение локальных имен подключенных серверов

Я пытаюсь получить имена хостов сервера, подключенного к локальной сети, чтобы я мог выполнить запрос к этим серверам с именем хоста:

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 секунды.

Есть ли что-то, что я сделал неправильно, или каким-либо образом (ы), чтобы получить имена узлов быстрее?

2 ответа

Решение

Вы, вероятно, столкнулись с долгим поиском DNS или SAMBA (только предположение). Это скорее поведение, связанное с сетью, а не с питоном. Попробуйте запустить свой скрипт с профилировщиком: python -m cProfile -s tottime lookup.py

Если мое предположение верно, вы бы увидели длинный _socket.gethostbyaddr время, тогда единственный хороший вариант - попытаться распараллелить Ваш код (или улучшить сетевые настройки для лучшего времени поиска).

Я решил свою проблему благодаря предложению Яна. Это займет около 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
Другие вопросы по тегам