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