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-адрес хоста, на котором выполняется скрипт python, то ответ, предоставленный user2096338, является правильным.
Для обнаружения всех компьютеров в сети внутри локальной сети вы можете использовать скапи. https://github.com/bwaldvogel/neighbourhood/blob/master/neighbourhood.py - это ссылка, которую я нашел во время просмотра аналогичного SO вопроса; который обнаруживает все компьютеры в сети (LAN).
Если вы хотите убедиться, что приведенный выше сценарий возвращает только те компьютеры, на которых работает ваш сервер - тогда есть несколько способов сделать это, перечисленных ниже в порядке переносимости
- всякий раз, когда вы устанавливаете свой сервер на хост, затем регистрируйтесь в центральной базе данных, которая затем может быть запрошена новым экземпляром вашей службы для идентификации всех компьютеров, на которых работают одноранговые серверы
- используйте WMI (поскольку вы находитесь в Windows) для запроса всех процессов, запущенных на узле system anc проверьте, является ли ваш серверный процесс одним из них.
- ваш сервер будет держать пробный порт открытым, и новая установка сервера будет пинговать на сервер на этом пробном порту для каждого из хостов в сети. Если он получает ответ, то на этом компьютере выполняется серверный процесс.
На мой взгляд, метод 1 является самым безопасным и переносимым, так как он предотвращает открытие ненужных портов (как метод 3), которые являются дырами безопасности (в зависимости от того, чей контекст ваш запускается скрипт python). Это также не зависит от доступности службы WMI на удаленных хостах (в некоторых системах WMI может быть отключен).
Надеюсь, это поможет
Для имени хоста и ip локального Хоста можно использовать модуль сокета и gethostname, а также методы gethostbyname:
import socket hostname = socket.gethostname() IP = socket.gethostbyname(hostname)
Comments