Определение ip адреса с помощью perl


вычислить сетевой адрес с помощью perl

0 jotpe [2015-06-08 23:17:00]

Как получить сетевой адрес класса c с адреса ipv4 в perl?

Я уже пробовал это:

Невозможно вызывать метод «префикс» по неопределенному значению на странице /usr/share/awstats/plugins/geoipfree.pm line 101, строка 1.

2 ответа

4 Решение ikegami [2015-06-08 23:30:00]

Net::IP->new возвращает undef при ошибке. Сообщение об ошибке можно получить, вызвав Net::IP::Error() .

Вероятно, это было неудачно, потому что вы указали префикс без использования базового адреса подсети. Например, он будет сбой для 10.1.2.3/24 , но не для 10.1.2.0/24 .

Поскольку вы пытаетесь найти базовый адрес подсети, это означает, что вам нужно опустить /24 и применить его как маску к адресу. Однако я не вижу способа применить маску к объекту Net :: IP. Фактически, я не вижу никакого способа использования Net :: IP для получения базового адреса подсети.

С другой стороны, это тривиально, используя NetAddr :: IP.

Конечно, вы также можете использовать

0 Sobrique [2015-06-09 00:07:00]

Икегами дал вам решение, но я укажу кое-что. IP-адреса — это просто базовые 256 номеров. CIDR включает «бит-маски», которые применяются к IP-адресу для различения сетевого адреса с адреса хоста.

Поэтому, учитывая IP 10.11.12.13 — представление:

При работе с битмасками вы логически ‘и’ маску, чтобы получить «сетевую часть». A /24 — 24 бита (из 32):

Поэтому, если вы берете IP-адрес выше, побитовое and получите свой сетевой адрес. Немного похоже на это:

Не особенно сложно, но, надеюсь, иллюстрирует, почему «правильный» ответ «использует модуль» — конверсии назад и вперед могут быть подвержены ошибкам.

perl — Как определить IP-адреса локального компьютера с Perl?

Есть ли чистый и независимый от ОС способ определения IP-адресов локального компьютера с Perl?

До сих пор я нашел следующие решения:

проанализировать вывод ifconfig и ipconfig (жесткие, разные версии Windows имеют разные выходы ipconfig)

установить сетевое соединение с известным IP-адресом и проверить локальный IP-адрес сокета (не будет работать, если я не могу установить соединение и определю только один IP-адрес)

Любое лучшее предложение?

    3 11
  • 19 май 2020 2020-05-19 21:08:54
  • Zizzencs

11 ответов

Net:: Address:: IP:: Local работает нормально, но поскольку исходный плакат запрашивает все локальные адреса, я думаю, что это лучше:

Он отлично работал у меня с ActivePerl для Windows XP.

  • 19 май 2020 2020-05-19 21:08:57
  • golimar

Пример извлечения IP-адресов (в Powershell, но это довольно ясно, что происходит)

Пример доступа к WMI с Perl (не те же функции WMI, но снова процесс достаточно понятен)

РЕДАКТИРОВАТЬ: после поиска в кодах Google для поиска Networkadapterconfiguration и языка «perl»:

EDIT2: на самом деле код OCS, похоже, содержит код для большинства платформ, поэтому, хотя не может быть ни одного набора кода, который сделает это, вы сможете повторно использовать свои идеи. Это GPLd, однако.

Например, здесь код Solaris. Другие биты охватывают BSD, Linux, MacOS.

  • 19 май 2020 2020-05-19 21:08:57
  • The Archetypal Paul

Я использовал комбинацию этих команд Linux, поэтому не зависел ни от какого-либо модуля perl.

  • 19 май 2020 2020-05-19 21:08:57
  • PodTech.io

для окон, которые я использую

Первой строкой, начиная с 0.0.0.0, является шлюз по умолчанию. Там может быть несколько шлюзов. Строки, начинающиеся с 255.255.255.255, также полезны. netstat -r и печать маршрута одинаковы.

Может быть адаптирован для OSX, Linux не очень полезен.

  • 19 май 2020 2020-05-19 21:08:57
  • Matt
  • 19 май 2020 2020-05-19 21:08:56
  • Lux In Tenebris

У меня был хороший успех с IO::Interface в Linux и Solaris, и я думаю, что он даже работал в AIX, но я могу» t наверняка вспомнить. Находясь на сайтах search.cpan.org, rt.cpan.org и ActiveState, похоже, что IO:: Interface может испытывать проблемы с созданием в Windows. Я думаю, единственный способ узнать, доступно ли это для поиска io-интерфейса в PPM.

  • 19 май 2020 2020-05-19 21:08:56
  • converter42

Perldoc имеет ответ на этот вопрос в своем FAQ ( «perlfaq9» ) — используя разные модули (которые являются частью стандартной библиотеки) или даже встроенная функция.

  • 19 май 2020 2020-05-19 21:08:56
  • evgeny9

Чтобы получить IP-адрес всех интерфейсов, используйте IO::Interface::Simple:

Если вас не интересует 127.0.0.1 (loopback), вы можете фильтровать на $_->is_loopback .

  • 19 май 2020 2020-05-19 21:08:56
  • dolmen

В моем случае мне нужно решение без каких-либо неосновных зависимостей. Я придумал это после изучения кода в Net:: Address:: IP:: Local:

get_local_ip_address() должен возвращать ту же строку, что и Net::Address::IP::Local->public_ipv4 .

При желании вы можете изменить атрибут PeerAddr (в аргументах конструктора для IO:: Socket:: INET) на локальный DNS-сервер.

  • 19 май 2020 2020-05-19 21:08:55
  • Tommy Stanton

У вас также есть другие параметры, включая ваше решение «установить сетевое соединение с известным IP-адресом и изучить локальный IP-адрес сокета адрес».

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

нет такой вещи, как IP-адрес хоста.
Сетевые интерфейсы имеют IP-адреса, а не хосты, а один сетевой интерфейс может иметь множество (виртуальных) IP-адресов. Подсистема маршрутизации операционной системы решает, какой сетевой интерфейс и IP-адрес использовать для подключения к удаленному компьютеру.

Если ваш компьютер имеет только один внешний сетевой интерфейс, и этот интерфейс имеет только один IP-адрес, то этот IP-адрес обычно называют адресом устройства, но это неточно. Например, если аппарат подключен к VPN через виртуальный интерфейс, он будет использовать этот IP-адрес интерфейса для подключения к другому компьютеру в VPN, а не к внешнему IP-адресу

Среди других решений: использует » Sys::Hostname »
(Работает, если Sys::Hostname содержит разрешаемое имя хоста)

Subnets.ru blog

Сети, настройка оборудования, сетевые сервисы.

Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли — задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Скрипты (функции) Perl и PHP для проверки вхождения IP-адреса в подсеть

Многие ищут/спрашивают функции для проверок IP-адресов на вхождение в подсеть, итак:

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Панфилов Алексей (lehis (at) subnets.ru)

Похожие статьи:

    Не найдено

Поделиться ссылкой:

Эта статья размещена lehisnoe 17.06.2008 в 16:40 в рубриках Networks, Программинг. Метки: aton, ip, netmask, Networks, ntoa, perl, php. Вы можете оставить отзыв или trackback с вашего собственного сайта. Отслеживайте все отзывы и комментарии к этой статье при помощи новостной ленты RSS.

Комментариев: 1

lehisnoe сказал:

В php для операций с преобразованием IP адресов возможно воспользоваться встроенными функциями ip2long и long2ip.

В MySQL — также есть встроенные функции INET_ATON и INET_NTOA.

Добавить комментарий

Вам следует авторизоваться для размещения комментария.

Как получить CIDR IP обозначения из IP и подсети с помощью Perl

Есть функция Perl, что, учитывая IP-адрес и маску подсети, можно вернуть CIDR обозначения из подсети IP принадлежит?

Например, предположим , у меня есть IP 192.168.1.23 с маской подсети 255.255.255.0 , я хочу , чтобы получить значение 192.168.1.0/24 .

Или , если я 192.168.1.23 с маской подсети , 255.255.255.224 я хочу 192.168.1.0/27 и так далее.

Я мог бы в конечном итоге построить функцию, которая делает это так, но я считаю, трудно поверить, есть не то, что уже делает это.

Я рекомендую вам использовать NetAddr::IP модуль. Это простой вопрос построения объекта с требуемым IP — адресом и маской сети и вызова network метода на нем

вывод

Если вы хотите расфасованное решения, вы можете использовать addrandmask2cidr функцию от Net :: CIDR .

Если вы хотите , чтобы свернуть свой собственный, базовый алгоритм для подсчета количества установленных битов в маске , чтобы получить значение после косой черты (например, 255.255.255.0 в двоичном 11111111.11111111.11111111.00000000, 24 бит установлен, поэтому CIDR / 24 ) и сделать логический и ( & ) адрес с маской , чтобы получить базовый адрес сети.

Определение ip адреса с помощью perl

.
81.25.165.0/24
81.25.166.0/24
81.25.167.0/24
81.25.168.0/24
81.25.169.0/24
81.25.170.0/24
81.25.171.0/24
81.25.172.0/24
81.25.174.0/24
81.25.175.0/24
81.26.128.0/20
81.26.129.0/24
81.26.129.253/32
.

Это база русских подсетей (по мнению моего хостера)

Как мне проверить IP адрес пользователя на «русскость», имея этот файл?
Общих советов просьба не давать, мне нужен конкретный кусок кода. Всего записей: 21 | Зарегистр. 07-10-2005 | Отправлено: 14:08 22-12-2005

SiMM

Silver Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата:

мне нужен конкретный кусок кода.

50$

Предупреждение за флуд.
Есть что по теме, отвечаем, нет, молчим и не нервничаем.
А предлагают свои услуги тут.

Всего записей: 2300 | Зарегистр. 14-05-2004 | Отправлено: 14:37 22-12-2005
Anub

BANNED

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата:

50$

SiMM, вы не в тот раздел попали.

Всего записей: 21 | Зарегистр. 07-10-2005 | Отправлено: 14:59 22-12-2005
N Sensey N

Advanced Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору SiMM
Здесь не все шутки понимают =))

Anub
Ты попробуй что то сам сделать. а мы поможем

———-
sPaiz-Nuke — Free PHP CMS Web Design and Development Портал для израильтян
Всего записей: 1409 | Зарегистр. 01-10-2002 | Отправлено: 15:17 22-12-2005
batva

crazy administrator

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ну да, стоило мне отойти, как пошел флейм..
Ну как обычно..
Anub
N Sensey N
Не стоит это комментировать, тем более если видите уже предупреждение модератора.

Цитата:

мне нужен конкретный кусок кода.

Ок, вот тебе конкретный рабочий скрипт.

Код:

#!/usr/bin/perl
use strict;
use LWP::Simple qw(get);
my $listip = get(«http://noc.masterhost.ru/allrunet/runet») or die «connect problem»;

use Net::IP::Match::Regexp qw(create_iprange_regexp match_ip);
my $regexp = create_iprange_regexp(split /\n/,$listip);
my @ip_to_check = qw(217.16.16.105 64.233.187.99 81.19.70.3) ;#yandex.ru, google.com rambler.ru

foreach (@ip_to_check) <
if (match_ip($_, $regexp)) <
print «$_ => российский IP\n»;
>
else <
print «$_ => нет\n»;
>
>
#use Data::Dumper;
#print Dumper $regexp;
—————————
217.16.16.105 => российский IP
64.233.187.99 => нет
81.19.70.3 => российский IP

Я беру список российских IP через веб для наглядности, ест-но нужно брать из локального файла.

Модуль Net::IP::Match::Regexp интересен тем, что преобразует список диапазонов в один регексп.

В данном случае он получается вот такой

Подробнее.
Конечно на это расходуется относительно большое время , вот тут наглядно видно, но за то потом опережает все другие алгоритмы.

Но.
При данной постановке задачи, (список российских IP обновляется не так часто),
а значит лучше вообще не брать никакой список, а использовать сразу этот регексп, и время от времени его обновлять, допустим по крону.
Экономится значительное время на парсинг.
Работает ну очень быстро, perl рулит.

Код:

[root@ru-board temp]# time perl ip.pl
217.16.16.105 => российский IP
64.233.187.99 => нет
81.19.70.3 => российский IP

real 0m0.064s
user 0m0.060s
sys 0m0.004s

Ну а если это дело еще посадить на fast_cgi то думаю просить хостера поставить maxmind не понадобится.
Хотя я юзаю именно maxmind, но это если у тебя свой сервер, либо хостер добрый.

Всего записей: 12593 | Зарегистр. 07-01-2001 | Отправлено: 16:38 22-12-2005
SiMM

Silver Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору batva, а почему вы решили, что ему надо на Perl?
Цитата:

SiMM, вы не в тот раздел попали.

Извини, но это ты не в тот раздел попал. С запросами типа «сделайте за меня всё, быстро нах» — это не сюда. Если я конечно правильно понимаю правила этого раздела.
PS: и, кстати, юзать там регулярки — имхо, неэффективно. Да и формат входных данных далеко не самый удачный (хотя ни что не мешает преобразовать)

Всего записей: 2300 | Зарегистр. 14-05-2004 | Отправлено: 18:18 22-12-2005 | Исправлено: SiMM, 18:21 22-12-2005
Anub

BANNED

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата:

batva

, пасиб конечно, но я имел в виду скрипт на php

Всего записей: 21 | Зарегистр. 07-10-2005 | Отправлено: 19:10 22-12-2005
batva

crazy administrator

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору SiMM

Цитата:

а почему вы решили, что ему надо на Perl?

А я ничего не решал.

Тут два момента.

1. Язык не был указан, но даже если ему perl не подходит, то завтра придет другой, и я его пошлю в этот топик, и код в любом случае будет востребован.

2. Просто мне perl интересен, а корячиться и делать это на пхп увольте.

Туева куча кода, куча времени, разные алгоритмы поиска методом проб, и в результате.. все это будет на порядок медленней..

Только не нужно говорить, что вот если по уму, то надо все это сохранить в какой нить особый формат, погрузить в мускула, и вот тогда, вот тогда будет быстро..

Ну если у нас и к мускулу доступ есть, тогда нахрена вообще козе баян. скажите, зачем изобретать велосипед?

Быстрее чем maxmind сделать все равно не получится.

Цитата:

пасиб конечно, но я имел в виду скрипт на php

Чем тебя не устраивает perl? Он есть на любом хостинге.
Учитесь решать задачи быстрыми, и эффективными средствами.
Ну да ладно, в религию вдаваться не будем.
Хотите на php пожалуйста.

Вот алгоритм преобразования IP адреса в эффективный для поиска формат и наоборот.

Как из записи вида 81.25.165.0/24 получить диапазон, найдешь тут

Тебе останется только написать кусок кода по готовым алгоритмам, который сконвертит исходный список IP в нужный формат, и засунет это в базу.
Это плевое дело, но как ты понимаешь, никому кроме тебя не нужное..
Поэтому писать придется тебе.

Будут конкретные вопросы, спрашивай, уважаемый SiMM тебе подскажет, причем бесплатно.

Всего записей: 12593 | Зарегистр. 07-01-2001 | Отправлено: 20:15 22-12-2005
SiMM

Silver Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата:

А я ничего не решал.

Да я это сказал только к тому, что вопрос был задан с нарушением правил форума. Если мне память не изменяет — там есть пунктик — в названии темы топика ОБЯЗАТЕЛЬНО должно быть название используемого инструмента.
Цитата:

Я прав?

Типа да.
К вышеприведённому добавить больше нечего, кроме разве что ip2long.

Всего записей: 2300 | Зарегистр. 14-05-2004 | Отправлено: 20:19 22-12-2005
batva

crazy administrator

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Либо если сервер свой, лучше поставить C библиотеку и юзать вот это http://www.maxmind.com/app/php

Цитата:

Если мне память не изменяет — там есть пунктик — в названии темы топика ОБЯЗАТЕЛЬНО должно быть название используемого инструмента.

да, верно.
Переименуюв перл/пхп ибо тут уже есть и то и другое..

Всего записей: 12593 | Зарегистр. 07-01-2001 | Отправлено: 20:22 22-12-2005
Anub

BANNED

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ну допустим есть у меня этот файл со списками адресов (давал кусок из него выше)

Я думаю алгоритм должен быть такой: построчно сравнивать IP юзера с IP, данным в файле на текущей строке.

Но как сравнить 62.63.72.1 с 81.26.129.253/32?
Я так полагаю правый IP надо как-то трансформировать, и сравнивать с левым через preg_match ? Подскажите пожалуйста именно эту часть кода!

Всего записей: 21 | Зарегистр. 07-10-2005 | Отправлено: 20:57 22-12-2005
SiMM

Silver Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата:

Я так полагаю правый IP надо как-то трансформировать

ip2long, я вам уже писал. А что делать с маской подсети — можно узнать из ссылки на гугл, которую дал batva. Тебе до кучи понадобятся побитовые операции

Всего записей: 2300 | Зарегистр. 14-05-2004 | Отправлено: 21:00 22-12-2005 | Исправлено: SiMM, 22:03 22-12-2005
Cheery

.:МордератоР:.

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Anub
http://www.phpclasses.org/browse/file/11663.html
Подробнее.

———-
Away/DND
Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:06 22-12-2005
Anub

BANNED

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата:

Cheery

, в скрипте явно много лишнего. я думал эту проверку можно выполнить гораздо проще. Ладно, умываю руки.

Всего записей: 21 | Зарегистр. 07-10-2005 | Отправлено: 21:16 22-12-2005
Cheery

.:МордератоР:.

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Anub

Цитата:

в скрипте явно много лишнего

явно? ткни пальцем на то, что лишее?
не используется ip2long, а созданы собственные функции.

———-
Away/DND
Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:18 22-12-2005
Anub

BANNED

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору 62.63.72.1 и 81.26.129.253/32.

КАК определить, входит ли 62.63.72.1 в енту подсеть 81.26.129.253/32?
К чему тут применить ip2long и что делать дальше?

Курсы/Язык программирования Perl/Лекция 17: Работа в IP-сетях

Материал из Intuit

Работа в IP-сетях

Аннотация: В этой лекции рассказывается об имеющихся в Perl возможностях обработки данных в IP-сетях, начиная с низкоуровневых средств и заканчивая классами для работы с основными сетевыми протоколами.

Цель лекции: узнать основные механизмы передачи данных по сети и научиться применять их для обработки данных в своих программах, используя стандартные и дополнительные модули Perl. НЕТ ДАННЫХ

Содержание

Сетевое программирование

Сегодня большинство пользователей компьютеров воспринимают возможность обмена данными по компьютерной сети как нечто само собой разумеющееся. Это может быть небольшая офисная сеть из нескольких станций, корпоративная сеть, объединяющая многие сотни компьютеров, или подключение к глобальной сети Интернет. Легкость и удобство работы с многочисленными сетевыми сервисами стала возможной благодаря длительным усилиям многих выдающихся программистов, самых разных компаний и организаций из многих стран мира по созданию существующей инфраструктуры сетевых технологий. Эта инфраструктура основана на огромном числе стандартов, позволяющих согласованно использовать линии связи, аппаратуру передачи данных, компьютеры, операционные системы и прикладные программы для обмена информацией по сети.

Подавляющее большинство широко используемых сетей работает на основе протокола передачи данных IP (Internet Protocol), обеспечивающего надежное перемещение информации между компьютерами в разных сетях. Протокол — это система правил для согласованного взаимодействия при обмене информацией. При сетевом взаимодействии используется целый набор протоколов, обычно называемый стеком протоколов, который подразделяется на несколько уровней. На каждом из уровней выполняются определенные действия и преобразования данных. Протокол IP отвечает за сетевой уровень доставки информации, разделенной на специальные блоки данных, которые называются пакетами (packet).

Для идентификации объединенных в сети компьютеров или других сетевых устройств, обобщенно называемых хостами (host), используются последовательности из четырех чисел — IP-адреса: например, 192.168.82.83 или 172.16.2.73. Назначенный IP-адрес служит уникальным идентификатором хоста в конкретной сети. Кроме того, каждый хост, настроенный на работу с протоколом IP и даже не подключенный к сети, имеет собственный специальный адрес 127.0.0.1 — что-то вроде местоимения «я» на языке сетевых коммуникаций. Хост может иметь доменное имя, соответствующее его IP-адресу, например, имя хоста www.perl.com соответствует адресу 208.201.239.36. Собственному адресу 127.0.0.1 соответствует специальное имя localhost. Поскольку на каждом хосте может выполняться несколько сетевых программ, то для распределения между ними получаемых и отправляемых пакетов используются дополнительные числовые обозначения, так называемые номера портов. Поэтому программная точка отправления или доставки данных в IP-сетях определяется сочетанием адреса и порта, разделенных двоеточием. Многие номера портов по общепринятым соглашениям закреплены за определенными сетевыми службами. Например, обращение к web-серверу на текущей машине будет происходить по адресу и порту 127.0.0.1:80, а к почтовому серверу — по 127.0.0.1:25.

Для установления соединения между хостами и обмена данными в IP-сетях применяется механизм сокетов. Сокеты (socket) можно рассматривать как логические каналы двусторонней связи между сетевыми программами. Сокет определяется адресом хоста, номером порта и используемым протоколом обмена данными. Для организации пересылки данных между программами применяется один из двух протоколов транспортного уровня — UDP или TCP, выполняющихся поверх протокола IP. Протокол UDP (User Datagram Protocol) применяется для обмена независимыми блоками данных, называемыми дейтаграммами (datagram), без их гарантированной доставки адресату. Например, с использованием протокола UDP отправляются запросы управления устройствами или пересылается аудио- или видеотрансляция, когда потеря нескольких передаваемых пакетов не слишком существенна. Протокол TCP (Transmission Control Protocol) применяется для передачи по сети потока данных. При этом контролируется гарантированная доставка упорядоченной последовательности пакетов адресату. При помощи протокола TCP, например, отправляется электронная почта, передаются файлы и доставляются web-страницы.

Средства работы с сокетами

Даже если в большинстве случаев при сетевом программировании на Perl используются более высокоуровневые средства, полезно хотя бы очень бегло познакомиться с принципами обмена данными через сокеты. Особенностью Perl, отражающей его сетевую направленность, стало то, что многие примитивные сетевые операции встроены в ядро языка, например: socket , socketpair , getsockname , getpeername , setsockopt , bind , listen , accept , send , recv , shutdown . Но гораздо удобнее и надежнее пользоваться стандартными модулями, реализующими средства работы с сокетами. В стандартном модуле Socket определены вспомогательные функции для работы с сокетами. Например, функция inet_ntoa() преобразует в строку двоичное представление IP-адреса, которое возвращает встроенная функция gethostbyname . А функция inet_aton() преобразует строковое представление адреса в двоичный вид, требуемый для встроенной функции gethostbyaddr, определяющей доменное имя хоста по IP-адресу. Работу этих функций можно показать на таком примере:

Класс IO::Socket предоставляет объектный интерфейс для встроенных функций и помогает справиться со многими трудностями и избежать некоторых ошибок при программировании передачи данных через сокеты. Максимально упрощенный пример демонстрирует написание сервера для приема сообщений по протоколу TCP:

Сокеты могут использоваться не только для обмена данными по сети, но и для межпроцессного взаимодействия, когда сервер и клиент работают на одном и том же компьютере. Для доступа к приведенному серверу можно использовать, например, такую клиентскую программу:

Из этого незатейливого примера можно сделать такой вывод: для согласованной работы клиент и сервер должны следовать установленным «правилам общения» во время сеанса обмена данными, так называемому протоколу прикладного уровня. В нашем случае правила сводятся к тому, что обмен идет по порту 5555, сервер ждет от клиента только одно сообщение, клиент ждет обязательного ответа от сервера, который завершает работу по получении сообщения, в котором содержится строка ‘STOP’. Подробные соглашения описываются в конкретных протоколах сетевого обмена, например: HTTP (передача гипертекстовых документов), SMTP (отправка электронной почты), FTP (передача файлов). Описание подобных протоколов и других соглашений публикуются в виде предложений RFC (Request For Comment) — фактических международных стандартов, на которые ориентируются разработчики сетевого программного обеспечения.

Передача файлов

Во Всемирной сети Интернет насчитывается огромное количество файловых серверов, где хранятся архивы программ, документация и другая информация. FTP (File Transfer Protocol) — это протокол, специально созданный для передачи файлов. Обмен файлами остается одной из постоянных задач сетевого программирования, которая легко решается средствами языка Perl. В поставке Perl имеется стандартный модуль Net::FTP , реализующий FTP-клиента, который позволяет весьма просто организовать обмен файлами с сервером по протоколу FTP — например, автоматизировать автоматическое обновление нужных файлов с сервера. Далее приводится программа, которая с помощью команд FTP загружает с сервера файл, если он имеет более позднее время изменения, чем его локальная копия:

Поскольку в классе Net::FTP реализованы остальные команды протокола FTP, с его помощью можно разрабатывать гораздо более сложные программы файлового обмена. Кроме этого класса, в архивах CPAN можно найти много других модулей для обмена файлами с FTP-серверами.

Электронная почта

Электронная почта (e-mail) была и остается одним из самых популярных сетевых сервисов. Электронная почта базируется на асинхронной доставке почтового сообщения (message) с одного почтового сервера на другой с помощью протокола SMTP (Simple Mail Transfer Protocol). Почтовые сообщения каждого пользователя хранятся на сервере в отдельном почтовом ящике (mail-box). Клиентская почтовая программа (Mail User Agent, MUA) забирает почту с сервера с помощью одной из версий протокола POP (Post-Office Protocol) или предоставляет пользователю непосредственный доступ к ящику на почтовом сервере с помощью протокола IMAP (Internet Mail Access Protocol).

Естественно, что в Perl имеется множество средств работы с электронной почтой. По электронной почте можно организовать автоматическое уведомление системных администраторов или пользователей о наступлении определенного события. С помощью сообщений электронной почты организуется регулярная автоматическая рассылка информации, например, счетов клиентам. При работе с почтой можно воспользоваться стандартными модулями — Net::SMTP для отправки сообщений и Net::POP3 для их получения. Приведем пример простой программы, отправляющей сообщение электронной почты:

Если нужно в программе проверить почтовый ящик на сервере, то с помощью класса Net::POP3 не составит труда написать короткую программу, принимающую электронную почту. Например, такую:

На серверах CPAN есть множество программ для работы с электронной почтой, включая серверы. На Perl написана свободно распространяемая почтовая система с web-интерфейсом Open WebMail (openwebmail.org). На нем же написана и одна из самых известных и эффективных серверных систем фильтрации спама — SpamAssassin.

Системы обмена сообщениями

Системы мгновенного обмена сообщениями (instant messaging), иногда также называемые Интернет-пейджерами, получили огромное распространение: миллионы людей ежедневно общаются с помощью ICQ, Jabber, AOL Instant Messenger или Yahoo!Messenger. В архивах на сайте CPAN можно найти Perl-модули для работы со всеми этими системами. Хотя этот обмен сообщениями ориентирован на взаимодействие людей, его можно использовать для программного извещения пользователя о каком-либо событии. Для примера напишем программу, отправляющую сообщение с использованием открытого протокола мгновенного обмена сообщениями XMPP/Jabber (дополнительный модуль Net::Jabber нужно установить из архива CPAN). В примере после соединения с Jabber-сервером отправляется сообщение пользователю, а после получения от него ответа работа завершается:

В этом примере демонстрируется прием программирования, распространенный при работе в многозадачной среде: главная программа организует бесконечный цикл обработки событий, для реагирования на которые вызываются обработчики событий. Конечно, помимо обмена сообщениями Jabber предоставляет целый набор средств для полноценного общения, а Perl дает возможность работать с ними.

Есть примеры использования Perl для разработки шлюзов между IP-сетями и беспроводными сетями. На Perl написан свободно распространяемый пейджинговый шлюз Sendpage ([www.sendpage.org|www.sendpage.org]). Класс Net::SNPP занимается отправкой сообщений на пейджер по протоколу SNPP (Simple Network Paging Protocol), а модуль Net::SMS служит для работы со службой SMS-сообщений для клиентов GSM-телефонии. Теперь мало кого удивляет, что вскоре после появления очередной новой технологии передачи данных на CPAN выкладываются Perl-модули для работы с ней.

Управление сетями

Крупную компьютерную сеть можно сравнить с живым организмом: сетевое оборудование и компьютеры — это ее органы, а линии связи — нервные волокна. Сеть ежеминутно меняет свое состояние, ее составные части могут «болеть» и «отмирать», сеть может «задыхаться» от чрезмерного объема передаваемых данных (сетевого трафика). Для мониторинга состояния сети, ее обслуживания и диагностики неисправностей применяются различные служебные программы. Некоторые из них написаны на языке Perl. В других случаях Perl применяется для «склеивания» разных программ в единую систему управления сетью. Если вспомнить, что Perl был создан системным администратором, то станет понятным, почему имеется так много модулей, так или иначе связанных с управлением сетями. В качестве простейшего примера можно привести стандартный класс Net::Ping, с помощью которого можно проверить работоспособность хоста по его IP-адресу. В ОС MS Windows это делается такой командой:

В ней запускается компилятор perl, который подключает модуль (-M) Net::Ping и выполняет выражение (-e), заключенное в двойные кавычки. А в выражении выводится результат обращения к методу ping класса Net::Ping с IP-адресом в качестве аргумента. В результате выполнения будет выведен адрес хоста и две 1, если хост активен, или два 0, если он не ответил.

Многие программные средства управления компьютерными сетями основаны на протоколе SNMP (Simple Network Management Protocol), использующего для обмена данными протокол UDP. Такие программные средства построены по принципу периодического опроса так называемых агентов, которые отвечают на запросы управляющей программы и передают ей информацию, накопленную во время работы подключенного к сети устройства — компьютера, принтера, маршрутизатора и так далее. Категории собираемой информации (управляемые устройства и их характеристики) имеют унифицированные имена и числовые идентификаторы объектов (Object IDentifier, OID), которые присваиваются производителями устройств в соответствии со стандартами описания «базы данных управляющей информации» MIB (Management Information Base). При определенных условиях по протоколу SNMP можно не только считывать по сети информацию с устройств, но и управлять этими устройствами, изменяя их характеристики. С помощью протокола SNMP можно также организовать управление программными комплексами, например, операционными системами и СУБД. На Perl написаны модули для работы c SNMP-агентами. Для иллюстрации сказанного приведем простой пример, в котором опрашивается агент, работающий на персональном компьютере, и у него запрашиваются две характеристики — описание системы и время ее работы:

В результате выполнения этой программы в ОС MS Windows будет выведена следующая информация:

Для отслеживания состояния сети имеется много готовых программных продуктов различной сложности. Сбором и накоплением информации о работе сети и ее визуализацией занимаются основанные на SNMP системы: Big Sister (bigsister.sourceforge.net), Cricket (cricket.sourceforge.net) и MRTG ([1]), которые распространяются свободно и написаны на языке Perl.

Другие сетевые сервисы

С момента своего создания язык Perl применялся системными администраторами для сетевого программирования. И постепенно было разработано неимоверное количество модулей для работы с самыми разными сетевыми сервисами. Даже упомянув лишь некоторые из них, можно составить представление о многообразии высококачественных решений сетевых задач, воплощенных в «жемчужных россыпях» хранилища модулей CPAN. В стандартном классе Net::NNTP реализован клиент новостных групп (телеконференций), располагающихся на многочисленных news-серверах. Perl-модули помогут сгенерировать документы для мобильных клиентов в формате WML (Wireless Markup Language). Модуль CDDB предоставляет интерфейс к сетевым базам данных по музыкальным компакт-дискам (Compact Disc DataBase). Имеются модули для работы с известными поисковыми системами: AltaVista, Google, Yahoo и с Интернет-магазинами Amazon и eBay.

В репозитарии CPAN можно найти модули для работы со всеми распространенными сетевыми протоколами: ARP (поиск физического адреса устройства по IP-адресу), DHCP (динамическое распределение IP-адресов), LDAP (доступ к каталогам типа Active Directory и NDS), NTP (запрос времени), RADIUS (авторизация пользователей), telnet и ssh (работа на удаленном терминале), VNC (сетевое управление компьютером) и многими другими. Причем Perl-модули могут использоваться для создания не только клиентских программ, но и серверов, которые можно встраивать в собственные приложения. И конечно же, есть огромное число модулей для работы с сервисами WWW, о которых пойдет речь в следующей лекции.

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

Основное

Личный кабинет

Архив рассматриваемых подпрограмм доступен для скачивания по адресу: http://geoip.elib.ru/Clients/geoip_client_pl.zip

Этот архив содержит библиотеку на языке Perl (файл geoip_client.pl) для работы с нашими сервисами. Он содержит две подпрограммы и примеры их использования. Рассмотрим более детально:

geoip_client_mini

Определяет географическое местоположение пользователя по IP адресу с использованием сервиса mini. Подпрограмме передается IP адрес, для которого необходимо получить информацию и уникальный код сайта, полученный при регистрации сайта в «Личном кабинете«. После отправки запроса на сервер и получения ответа, подпрограмма возвращает массив данных содержащий:

Порядковый
номер
элемента
массива
Значение элемента
Код ошибки
1 Географическая широта [градусы]
2 Географическая долгота [градусы]
3 Название населенного пункта

В строке 1 подключаем файл библиотеки. В строке 2 задаем переменной $sid уникальный код сайта, полученный при регистрации в «Личном кабинете«. В строке 3 определяем IP адрес для которого будем запрашивать информацию (адрес клиента, либо некий адрес по-умолчанию) и помещаем его в переменную $ip. В строке 4 вызываем подпрограмму geoip_client_mini и передаем ей в качестве параметра переменную $ip, определенную в строке 3, и переменную $sid, содержащую идентификатор сайта, заданный в строке 2. После отправки запроса на сервер и получения ответа, подпрограмма возвращает массив данных, описанный выше, и помещает его в переменные ($err,$lat,$lon,$town). В строках 5-7 выводим полученные данные.

Ниже приведен исходный код подпрограммы geoip_client_mini

geoip_client

Определяет географическое местоположение пользователя по IP адресу с использованием полноценного сервиса.

В строке 1 подключаем файл библиотеки. В строке 2 присваиваем переменой шестнадцатиричное значение информационных опций (подробное описание информационных опций приведено на странице «Описание основного сервиса«). В строке 3 задаем переменной $sid уникальный код сайта, полученный при регистрации в «Личном кабинете«. В строке 4 задаем массиву @ips список IP адресов, для которых будем запрашивать информацию. В строке 5 осуществляем вызов подпрограммы geoip_client. Для этого подпрограмме передается ссылка на массив @ips, список информационных опций, заданных в виде шестнадцатиричного числа и переменная $sid, содержащая уникальный код сайта. После отправки запроса на сервер и получения ответа, подпрограмма возвращает массив данных из двух элементов содержащий код ошибки и ссылку на структуру представляющую собой хеш хешей (т.е. хеш содержащий ссылки на хеши с информацией по запрошенным IP адресам). В строках 6-12 перебираем полученный хеш с помощью функции each и выводим информацию по адресам. В результате получаем массив из IP адреса и ссылку на хеш информации по этому адресу. Для вывода только одного значения, например названия региона для IP адреса 87.255.23.236, возможно использовать конструкцию вида:

Ниже приведен исходный код подпрограммы geoip_client

Работа по протоколу SOAP

Для работы с сервисом через протокол SOAP мы рекомендуем использовать модуль SOAP::Lite (доступен на CPAN.org). Для вызова метода GetDataMini, использующего mini-сервис, достаточно включить в Вашу программу следующий код:

В строке 1 подключаем модуль SOAP::Lite. В строках 3-6 вызываем метод GetDataMini для получения информации об IP адресе 87.255.23.236. В строке 8 выводим через запятую всю полученную информацию. В строке 9 выводим код ошибки.

Определение IP адреса

Значение REMOTE_ADDR : 188.64.174.135
HTTP заголовки, которые могут содержать информацию об IP адресе:
HTTP_CLIENT_IP : не установлено
HTTP_X_FORWARDED_FOR : не установлено
HTTP_VIA : не установлено
HTTP_X_REAL_IP : не установлено

Беллетристика
Один из самых дремучих вопросов в околопхпешном вебе — это определение IP адреса.
Такого количества неправильного кода не написано, наверное, ни для какой другой операции.

Каждый, кто в один прекрасный день узнаёт о существовании переменной HTTP_X_FORWARDED_FOR, тут же воображает себя мегагуру, и заменяет ей REMOTE_ADDR. Потом приходит знание о других переменных (X_REAL_IP, VIA, и ещё вагон и маленькая тележка), изобретаются многослойные мегаконструкции, изобретатели хвастаются друг перед другом их многоэтажностью и сравнивают свои творения с «кодом из PHPbb!».

При этом спроси любого из них — «какой именно адрес они хотят определить?» — ни один не ответит: понимание основ функционирования сети TCP/IP среди пхп-программистов традиционно слабое.
А вот стремление к нахождению Идеального и Единственно Правильного Решения — традиционно сильное.
В результате вместо IP адреса в логи пишется не пойми что.

К примеру, возьмем, казалось бы, простой вопрос «какой именно IP адрес (из цепочки хостов, через которые идет запрос от компьютера клиента к серверу) мы хотим записать в лог?». После того, как выяснилось, что большинство пхп-программистов затрудняются на него ответить, я и решил написать эту заметку.

А это, между прочим, очень важный вопрос. Не ответив на него, наряду с вопросом «Зачем нам нужен IP адрес?», приступать к самому определению бессмысленно.
При том, что большинству читателей этого текста вопросы покажутся бессмысленными.
Ну что ж, попробуем разобраться.

Теория
Во-первых. Самые азы. Для тех, кто не знает.
Все элементы массива $_SERVER, начинающиеся со слова «HTTP_» — это HTTP-заголовки.
Как уже знают вдумчивые читатели фака на танке, HTTP заголовки присылает клиент. И прислать может любые.
К примеру, заголовок X-All-Your-Base-Belongs-To-Us: Surrender!
Или, как вы уже, наверное, догадались, заголовок X-Forwarded-For: admin durak
Мне кажется, что записывать столь глубокомысленную строку вместо IP адреса — не самая лучшая идея.
Как и вообще доверять любым переменным, начинающимся с HTTP. Это первое правило, которое надо запомнить с молоком матери: Любые элементы массива $_SERVER, начинающиеся с «HTTP_», можно использовать только в справочных целях! К примеру, HTTP_REFERER записываем, чтобы потом посмотреть. Но ни в коем случае не делаем на него Location.

Во-вторых, определимся с тем, ДЛЯ ЧЕГО нам нужен IP адрес. Если мы хотим записать в лог, то пишем однозначно только REMOTE_ADDR. В этой переменной содержится реальный IP адрес реального хоста в интернете, который произвел соединение с нашим сервером. Единственный реальный адрес. Никаких других сервер не знает.
Апач пишет в логи именно REMOTE_ADDR. Не надо считать авторов веб-сервера дурнее себя.

Что значит — реальный IP адрес? А то и значит. Адрес хоста, который произвел соединение с нашим сервером. Этот адрес по определению может быть только один. Один, а не 5 по цепочке. Рассмотрим типичный пример:
Есть пользовательский компьютер, который, который находится в офисной сети. IP компьютера 192.168.0.22
Офисная сеть включена через роутер в сеть здания. IP роутера — 10.10.0.3
Сеть здания, в свою очередь, подключена к интернету, через роутер. IP роутера — 77.88.22.11
Пользователь заходит на сайт, через НТТР прокси. IP прокси — 212.121.0.8
Так вот, сеть TCP/IP так устроена, что каждый следующий узел ничего не знает о предыдущих. Есть только пара хостов, которые соединяются друг с другом. В самих TCP/IP пакетах никакой информации о предыдущих хостах не предусмотрено.
Поэтому, как это ни обидно, но реальным адресом мы можем считать только последний в цепочке — адрес HTTP прокси.

Больше того. Ну допустим, узнали мы адрес компьютера пользователя (чем кичатся многие определители с помощью activeX и ява-апплетов). Этот адрес — 192.168.0.22. Он из приватной сети. Компьютеров с такими адресами в мире — миллионы. Найти компьютер по такому адресу — невозможно. Пользы от него — практически никакой. Практически, но не совсем. Почему? Слушаем дальше:

Поскольку в протоколе HTTP текстовые заголовки, то в них можно добавить свой. Что некоторые хосты и делают. В те самые X-Forwarded-For, Via и прочие.
Можем мы их использовать? Можем. Если правильно понимать — для чего.
Для определения «реального IP адреса», как мы уже убедились — нельзя. А для чего же можно? Например — справки. просто записать, на всякий случай. НО! Только в том случае, если мы откажемся от дурацкой идеи найти один идеальный IP адрес. Если мы не будем писать вместо реального всякую лабуду, а будем записывать все похожее на IP адрес с реальным наряду, то почему нет?
Итак, можно записать всё, похожее на IP адрес. Понадобится выявить злостного вредителя — возможно, какой-то интересный айпишник среди заголовков и проскочит.
Для небольшого повышения надежности сессий — тоже можно. Писать в сессию не только реальный, но и все похожие. И все сверять. Хоть один не совпал — сессию рубим.
И в других подобных случаях.
Не забывая: реальный — отдельно, все похожее на IP адрес — отдельно.
Не забывая: особо полагаться на все эти заголовки не стоит.

Практика.
Итак. Из всего вышеизложенного делается простой вывод.
IP адрес в скрипте может быть только один. Лежит он в переменной REMOTE_ADDR.
Следовательно, вожделенный код получания «идеального IP адреса» выглядит, как
$ip = $_SERVER [ ‘REMOTE_ADDR’ ]
Точка.

Далее. Если мы хотим воспользоваться «заголовками, похожими на IP адрес» (лучше всего, во избежание недоразумений, совсем не считать их адресами хостов, а HTTP заголовками особого формата. Тем более, что никакого стандарта на содержимое заголовков X-Forwarded-For, Via и прочих — нет. Там могут оказаться IP адреса чарез запятую, или доменные имена или не через запятую. Не говоря уже о подделках!), то нет смысла судорожно искать все имена заголовков, где может встретиться адрес. Проще искать сами адреса.
Берем, пишем простой код, который в цикле перебирает массив $_SERVER, и регулярным выражением выцепляет все заголовки, в которых встречается подхдящая под шаблон IP адреса строка. Если встретилась, то весь заголовок — с именем и всем содержимым — добавляем в массив или в строку. Которая хранится отдельно от IP адреса, в текстовом виде.
Соответственно, в нужном месте повторяем операцию, и сверяем. IP адрес с IP адресом, строку похожих заголовков — со строкой похожих заголовков.
function get_all_ip () <
$ip_pattern = «#(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)<3>(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)#» ;
$ret = «» ;
foreach ( $_SERVER as $k => $v ) <
if ( substr ( $k , 0 , 5 )== «HTTP_» AND preg_match ( $ip_pattern , $v )) $ret .= $k . «: » . $v . «\n» ;
>
return $ret ;
>
Такой вот, несложный код.
Правда, нужда в нем, если задуматься, очень невелика. Разве что, для тех же сессий. А для справки, про запас. не проще ли писать вообще все HTTP заголовки, пришедшие в скрипт? И это поинформативнее будет, чем выцеплять какой-то один адрес из HTTP_X_REAL_IP.
Да и для сессий следует применять с осторожностью — IP адрес может оказаться, к примеру, в реферере.

Примечания.
Недавно я выяснил удивительную вещь. Оказывается, на свете существуют криворукие хостеры, у которых на сервере нет REMOTE_ADDR (а точнее есть, но в нем лежит. адрес самого сервера!). И пихают они адрес удаленного хоста кому куда бог на душу положит. Некоторые — вы будете смеяться — в HTTP_X_FORWARDED_FOR. Говорят, в некоторых больших программных продуктах есть даже специальная настройка для таких случаев — «Получать IP-адреса из заголовка X_FORWARDED_FOR».
Разумеется, этот курьёз не опровергает сказанного выше, и не стоит кидаться писать автоматические определители IP с его учетом. Все подобные случаи должны разбираться только в ручном режиме, самим программистом. Который сначала убедится — где именно в HTTP_X_FORWARDED_FOR лежит нужный адрес — в начале цепочки запятых или в конце, напишет правильный рег, и только потом в настройки сайта добавит код
$_SERVER[‘REMOTE_ADDR’]=get_ip_from_xff();

Примечание для хостеров: mod_realip или mod_rpaf
Примечание для пользователей: разумеется, таких хостеров надо избегать, как калёного железа. Наверняка ведь это не единственная их криворукость?

скрипт Как определить IP-адреса локальной машины с Perl?

webrtc определение ip (9)

Чтобы получить IP-адрес всех интерфейсов, используйте IO :: Interface :: Simple :

Если вас не интересует 127.0.0.1 (loopback), вы можете фильтровать на $_->is_loopback .

Есть ли чистый и независимый от ОС способ определения IP-адресов локальной машины с Perl?

До сих пор я нашел следующие решения:

проанализировать вывод ifconfig и ipconfig (жесткие, разные версии Windows имеют разные выходы ipconfig)

установить сетевое соединение с известным IP-адресом и проверить локальный IP-адрес сокета (не будет работать, если я не смогу установить соединение и определю только один IP-адрес)

Любое лучшее предложение?

Net :: Address :: IP :: Local работает нормально, но поскольку исходный плакат запрашивает все локальные адреса, я думаю, что это лучше:

Он отлично работал для меня с ActivePerl для Windows XP.

У меня был хороший успех с IO :: Interface в Linux и Solaris, и я думаю, что он даже работал в AIX, но я не могу вспомнить наверняка. Находясь на сайтах search.cpan.org, rt.cpan.org и ActiveState, похоже, что в IO :: Interface могут возникать проблемы с сборкой в ​​Windows. Я предполагаю, что единственный способ узнать, доступен ли он, — это поиск io-интерфейса в PPM.

Я использовал комбинацию этих команд Linux, поэтому не зависел ни от какого-либо модуля perl.

У вас также есть некоторые другие варианты , в том числе ваше решение «установить сетевое подключение к известному IP-адресу и изучить локальный IP-адрес сокета».

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

нет такой вещи, как IP-адрес хоста.
Сетевые интерфейсы имеют IP-адреса, а не хосты, а один сетевой интерфейс может иметь множество (виртуальных) IP-адресов. Подсистема маршрутизации операционной системы решает, какой сетевой интерфейс и IP-адрес использовать для подключения к удаленному компьютеру.

Если ваш компьютер имеет только один внешний сетевой интерфейс, и этот интерфейс имеет только один IP-адрес, этот IP-адрес обычно называется адресом компьютера, но это неточно.
Например, если аппарат подключен к VPN через виртуальный интерфейс, он будет использовать IP-адрес этого интерфейса для подключения к другому компьютеру на VPN, а не к внешнему IP-адресу

Среди других решений: используется « Sys::Hostname »
(Работает, если Sys::Hostname содержит разрешаемое имя хоста)

Пример извлечения IP-адресов (в Powershell, но это довольно ясно, что происходит)

Пример доступа к WMI с Perl (не те же функции WMI, но опять-таки процесс достаточно ясен)

РЕДАКТИРОВАТЬ: после поиска в кодах Google для Networkadapterconfiguration и языка «perl»:

EDIT2: На самом деле, OCS-код, по-видимому, содержит код для большинства платформ, поэтому, хотя не может быть ни одного набора кода, который сделает это, вы сможете повторно использовать свои идеи. Это GPL’d.

Например, вот код Solaris . Другие биты охватывают BSD, Linux, MacOS .

Perldoc имеет ответ на этот вопрос в своем FAQ («perlfaq9») — используя разные модули (которые являются частью стандартной библиотеки) или даже встроенной функцией.

Perl, Python — блог программиста

Функции perl для получения информации о сети

Функции: endhostent, endnetent, endprotoent, endservent, gethostbyaddr, gethostbyname, gethostent, getnetbyaddr, getnetbyname, getnetent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, sethostent, setnetent, setprotoent, setservent. Примеры кода.

Функции для получения информации о хостах

endhostent

Закрытие файла хостов после завершения обработки его содержимого.

gethostbyaddr

Возвращает описание интернет-узла по заданному сетевому адресу.

ADDR — это упакованный бинарный сетевой адрес, ADDRTYPE — тип, семейство протоколов.

Информацию о хосте получает от сервера имен или из файла /etc/hosts .

Просматриваем /etc/hosts на указанном сервере:

gethostbyname

Возвращает описание интернет-узла по указанному имени хоста.

Возвращается информация, полученная от сервера имен или произвольные поля из строки в /etc/hosts . Если нет доступа к серверу имен, то будет просматриваться локальный /etc/hosts .

Одному имени хоста может соответствовать несколько ip-адресов. Особенно часто это встречается в высоконагруженных проектах, где происходит распределение нагрузки по разным серверам.

Формат возвращаемых данных такой же, как для функции gethostbyaddr() .

Илон Маск рекомендует:  Как программно заставить выпасть меню
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL