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

Если вы хотите убедиться, что приведенный выше скрипт возвращает только те компьютеры, на которых работает ваш сервер-тогда есть несколько способов сделать это, перечисленных ниже в порядке переносимости

  1. всякий раз, когда вы устанавливаете свой сервер на хосте, затем регистрируйтесь в центральной базе данных, которая затем может быть запрошена новым экземпляром вашей службы для идентификации всех компьютеров, на которых работают одноранговые серверы
  2. используйте WMI (так как вы для запроса всех процессов, запущенных в одноранговой системе, проверьте, является ли ваш серверный процесс одним из них.
  3. ваш сервер будет держать пробный порт открытым, и новая установка сервера будет пинговать на сервер на этом пробном порту для каждого из хостов в сети. Если он получает ответ, то на этом компьютере выполняется серверный процесс.

на мой взгляд, метод 1 самый безопасный и портативный, так как он предотвращает открытие ненужного порты (например, Метод 3), которые являются дырами безопасности (в зависимости от контекста, в котором работает ваш скрипт python). Это также не зависит от доступности службы WMI на удаленных хостах (в некоторых системах WMI может быть отключен).

надеюсь, что это помогает


для имени хоста и ip localhost вы можете использовать модуль сокета и gethostname, а также методы gethostbyname:

import socket

hostname = socket.gethostname()
IP = socket.gethostbyname(hostname)