просто для ясности: я только начал Python 2 недели назад, но я разработчик C#, ASP, PHP, JavaScript.
Я только что начал новый проект с Python и PyQt, и я хочу, чтобы мой проект был сервером, который сможет взаимодействовать с другим экземпляром этого сервера на других компьютерах.
Итак, мне нужно получить IP-адрес компьютеров и имя хоста.
во-первых, я думал об использовании команды MSDOS "net view", но это было до попытки этого команда на моей работе и видя, что это может занять около
15 секунд (что, я думаю, слишком медленно).
кроме того, команда" 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 может быть отключен).
воскресенье, 14 августа 2011 г.
C# Получение IP адреса по имени
На C# есть несколько способов получения адреса по имени хоста. Самым распространённым является обработка возвращенного адреса после пинга
Ping p = new Ping ();
Для обхода данных проблем нужно воспользоваться более правильным подходом —
Для реализации процесса получения IP-адреса по имени хоста необходимо воспользоваться пространством имен «System.Net», которое предоставляет простой программный интерфейс для многих протоколов, используемых в современных сетях. Пространства имен «System.Net» содержат классы, обеспечивающие простой интерфейс программирования для различных сетевых протоколов, определяющие политики кэширования веб-ресурсов, а также порядок создания и отправки сообщений электронной почты, представляющие заголовки MIME, обеспечивающие доступ к данным о трафике и сетевых адресах, а также доступ к функции одноранговых сетей. Дополнительные дочерние пространства имен обеспечивают управляемую реализацию интерфейса Windows Sockets (Winsock) и доступ к сетевым потокам для защиты обмена данными между узлами.
В пространстве имен «System.Net» присутствует класс «DNS» с методом «GetHostAddresses», данный метод запрашивает у DNS-сервера IP-адреса, связанные с именем узла. Если «hostNameOrAddress» является IP-адресом, этот адрес возвращается без запроса DNS-сервера. Если в качестве имени узла передается пустая строка, этот метод возвращает IPv4-адреса локального узла для всех операционных систем, кроме Windows Server 2003; при использовании ОС Windows Server 2003 возвращаются и IPv4- и IPv6-адреса локального компьютера.
В следующем примере кода показано использование метода «GetHostAddresses», для получения IP-адреса по имени хоста.
Если вы хотите выполнить обратную процедуру, то можете воспользоваться методом «GetHostEntry», из этого же класса. Метод запрашивает у DNS-сервера IP-адреса и псевдонимы, связанные с IP-адресом и возвращает экземпляр «IPHostEntry», содержащий сведения об адресе. Данный экземпляр содержит три параметра:
- «AddressList» – список IP-адресов, связанных с узлом.
- «Aliases» – список псевдонимов, связанных с узлом.
- «HostName» – DNS-имя узла.
Свойство «HostName» содержит главное имя узла сервера. Если DNS-запись сервера определяет дополнительные псевдонимы, они будут доступны в свойстве «Aliases». Если не удается найти имя узла, возвращается исключение «SocketException» со значением «110001» (ошибка сокета Windows WSAHOST_NOT_FOUND). Так же это исключение может быть возвращено, если DNS-сервер не будет отвечать или если имя не является официальным именем или псевдонимом, или же это исключение невозможно найти в запрашиваемой базе данных.
В следующем примере кода показано использование метода «GetHostEntry», для получения имени хоста по IP-адресу.