Python Socket - получение локальных имен подключенных серверов - PullRequest
0 голосов
/ 05 декабря 2018

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

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 ]

0 голосов
/ 06 декабря 2018

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

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

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

...