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

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

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

Теги:
sockets
hostname
gethostbyaddr

2 ответа

0
Лучший ответ

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

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

0

Я решил свою проблему благодаря предложению Ян.

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.1)

print hostNamesList

Ещё вопросы

Сообщество Overcoder
Наверх
Меню