Python-получить IP-адрес компьютера и имя хоста в сети под управлением того же приложения
просто для ясности: я только начал Python 2 недели назад, но я разработчик C#, ASP, PHP, JavaScript.
Я только что начал новый проект с Python и PyQt, и я хочу, чтобы мой проект был сервером, который сможет взаимодействовать с другим экземпляром этого сервера на других компьютерах.
Итак, мне нужно получить IP-адрес компьютеров и имя хоста.
во-первых, я думал об использовании команды MSDOS "net view", но это было до попытки этого команда на моей работе и видя, что это может занять около ~15 секунд (что, я думаю, слишком медленно).
у меня была эта идея от:https://stackoverflow.com/a/15497083/1598891
кроме того, команда" net view " может возвращать компьютеры, которые больше не находятся в сети, и вызывать исключение при попытке получить их IP-адреса по имени хоста (что также замедляет процесс каждый раз, когда компьютер не может быть доступен).
мой вопрос: есть ли способ получить все компьютеры IP и имя хоста в локальной сети, не проходя мимо net view
на Windows, потому что net view
может быть медленная операция?
и есть ли способ получить только компьютеры, на которых работает мое приложение? (так было бы быстрее)
спасибо заранее
2 ответов
Если вы хотите получить IP-адрес хоста, на котором скрипт работает, то ответ user2096338 - это путь.
чтобы обнаружить все компьютеры в сети в локальной сети, вы можете использовать scapy. https://github.com/bwaldvogel/neighbourhood/blob/master/neighbourhood.py это ссылка, которую я нашел при просмотре как SO вопрос; который обнаруживает все компьютеры в сети (LAN).
Если вы хотите убедиться, что приведенный выше скрипт возвращает только те компьютеры, на которых работает ваш сервер-тогда есть несколько способов сделать это, перечисленных ниже в порядке переносимости
- всякий раз, когда вы устанавливаете свой сервер на хосте, затем регистрируйтесь в центральной базе данных, которая затем может быть запрошена новым экземпляром вашей службы для идентификации всех компьютеров, на которых работают одноранговые серверы
- используйте WMI (так как вы для запроса всех процессов, запущенных в одноранговой системе, проверьте, является ли ваш серверный процесс одним из них.
- ваш сервер будет держать пробный порт открытым, и новая установка сервера будет пинговать на сервер на этом пробном порту для каждого из хостов в сети. Если он получает ответ, то на этом компьютере выполняется серверный процесс.
на мой взгляд, метод 1 самый безопасный и портативный, так как он предотвращает открытие ненужного порты (например, Метод 3), которые являются дырами безопасности (в зависимости от контекста, в котором работает ваш скрипт python). Это также не зависит от доступности службы WMI на удаленных хостах (в некоторых системах WMI может быть отключен).
надеюсь, что это помогает
для имени хоста и ip localhost вы можете использовать модуль сокета и gethostname, а также методы gethostbyname:
import socket
hostname = socket.gethostname()
IP = socket.gethostbyname(hostname)