gethostbynamel — получает список IP-адресов, соответствующих имени данного Internet-хоста.


Содержание

Gethostbynamel — получает список IP-адресов, соответствующих имени данного Internet-хоста.

79907 просмотра

8 ответа

4364 Репутация автора

Как я могу легко получить список IP-адресов или имен хостов из локальной сети в Python?

Было бы лучше, если бы он был мультиплатформенным, но сначала он должен работать на Mac OS X, а затем другие.

Изменить: под локальным я подразумеваю все активные адреса в локальной сети, такие как 192.168.xxx.xxx .

Таким образом, если IP — адрес моего компьютера (в локальной сети) есть 192.168.1.1 , и у меня есть три других подключенных компьютеров, я хочу, чтобы вернуть IP — адрес 192.168.1.2 , 192.168.1.3 , 192.168.1.4 , и , возможно , их имена хостов.

Ответы (8)

плюса

1439 Репутация автора

Один из ответов на этот вопрос может помочь вам. Кажется, есть версия, независимая от платформы для python, но я еще не пробовал.

18 плюса

5112 Репутация автора

Если под «локальным» вы подразумеваете один и тот же сегмент сети, то вам необходимо выполнить следующие шаги:

  1. Определите свой собственный IP-адрес
  2. Определите свою собственную маску сети
  3. Определить диапазон сети
  4. Сканируйте все адреса (кроме самого низкого, который является вашим сетевым адресом, и самого высокого, который является вашим широковещательным адресом).
  5. Используйте обратный поиск в DNS, чтобы определить имя хоста для IP-адресов, которые отвечают на ваше сканирование.

Или вы можете просто позволить Python внешне выполнить nmap и передать результаты обратно в вашу программу.

10 плюса

5675 Репутация автора

Если вы знаете имена своих компьютеров, вы можете использовать:

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

Автор: Mapad Размещён: 16.10.2008 08:27

20 плюса

8286 Репутация автора

Обновление : скрипт теперь находится на github .

Я написал небольшой скрипт питона , которая использует scapy «s arping() .

3 плюса

Репутация автора

плюса

497 Репутация автора

Вот небольшой инструмент сканирования , который поможет вам получить все ip-адреса и их соответствующие mac-адреса в сети (работает на Linux). Это ссылка на сканер (сканер Ip и Mac), написанный на python. https://pypi.python.org/pypi/scanip/1.0

Вы также можете скачать его с помощью pip install scanip на linux и использовать его, создать тестовый файл на python и использовать его следующим образом:

и запустить эту программу. Все IP-адреса и соответствующие им MAC-адреса в локальной сети будут отображаться в терминале.

Автор: vivkv Размещён: 24.04.2020 09:03

3 плюса

1055 Репутация автора

Я собрал следующую функциональность из некоторых других потоков, и она работает для меня в Ubuntu.

плюса

16 Репутация автора

Я нашел этот сетевой сканер в статье на Python и написал этот короткий код. Он делает то, что вы хотите! Однако вам необходимо знать доступные порты для ваших устройств. Порт 22 является стандартом SSH и что я использую. Я полагаю, вы можете перебрать все порты. Некоторые значения по умолчанию:

Задание адреса gethostbyname

Изначально адрес задавался строкой addres.sin_addr.s_addr = htonl(INADDR_LOOPBACK);. Закаментированные строки это строки относящиеся к gethostbyname. Подскажите как им пользоваться пожалуйста.

26.07.2012, 22:30

gethostbyname() возвращает 11004
struct sockaddr_in addr; struct hostent* hp; int retval; retval = WSAStartup(MAKEWORD(1, 1).

Проблема с функцией gethostbyname
Здравствуйте. Написал простенькую программу: #include #include int main().

Ручное освобождение памяти. gethostbyname, inet_ntoa
Hello World! gethostbyname Возвращает указатель на hostent, а inet_ntoa возвращает указатель на.

gethostbyname не всегда ‘разрешает IP из адреса хоста’
При написании простенького Proxy столкнулся с проблемой — gethostbyname работает некорректно. А.

Задание MAC-адреса
Добрый день! Как известно, специальным битом в MAC-адресе можно указывать, что он задан вручную.

27.07.2012, 09:53 2 27.07.2012, 11:41 3 27.07.2012, 14:20 4 27.07.2012, 14:31 5 06.08.2012, 09:51 6

Специально для тебя.

The gethostbyname function returns a pointer to a hostent structure—a structure allocated by Windows Sockets. The hostent structure contains the results of a successful search for the host specified in the name parameter.

If the host specified in the name parameter has both IPv4 and IPv6 addresses, only the IPv4 addresses will be returned. The gethostbyname function can only return IPv4 addresses for the name parameter.
Прежде, чем морочить голову людям — учи мат часть!

Python — получить IP-адрес компьютера и имя хоста в сети с использованием того же приложения

Просто чтобы быть ясным: я только начал Python 2 недели назад, но я разработчик С#, ASP, PHP, JavaScript.

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

Итак, мне нужно получить IP-адрес компьютеров и имя хоста.

Во-первых, я подумал об использовании команды «net view» MSDOS, но это было прежде, чем попробовать эту команду на моей работе и увидеть, что это может занять около 15 секунд (что, я думаю, слишком медленное).

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

Мой вопрос: есть ли способ получить все компьютеры IP и имя хоста в локальной сети, не проходя через net view в Windows, потому что net view может быть медленной операцией?

Кроме того, есть способ получить только компьютеры, на которых запущено мое приложение? (так что это будет быстрее)

Если вы хотите получить IP-адрес хоста, на котором запущен python script, ответ, предоставленный user2096338, — это путь.

Чтобы обнаружить все компьютеры в сети в локальной сети, вы можете использовать scapy. https://github.com/bwaldvogel/neighbourhood/blob/master/neighbourhood.py — это ссылка, которую я нашел при просмотре аналогичного вопроса SO; который обнаруживает все компьютеры в сети (LAN).

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

  • Всякий раз, когда вы устанавливаете свой сервер на хосте, регистрируйтесь в центральной базе данных, которая затем может быть запрошена новым экземпляром вашей службы для идентификации всех компьютеров, на которых работают одноранговые серверы.
  • Используйте WMI (так как вы находитесь в Windows), чтобы запросить все процессы, выполняемые на равноправной системе anc, проверить, является ли ваш сервер одним из них.
  • Ваш сервер будет держать порт проверки открытым, а установка нового сервера будет пинговать на сервере в этом пробном порту для каждого из узлов в сети. Если он получает ответ, то на этом компьютере выполняется серверный процесс.

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

Gethostbynamel — получает список IP-адресов, соответствующих имени данного Internet-хоста.

int fsockopen (string hostname, int port, int [ errno ], string [ errstr ]);

Открывает сокетное соединение с доменом Internet по адресу hostname на порт port и возвращает файловый указатель, который может использоваться функциями fgets() , fgetss() , fputs() , и fclose() . Если вызов завершается неудачей, он возвращает FALSE и если указаны дополнительные аргументы errno и errstr , то они будут использованы, чтобы указать фактическую системную ошибку, которая случилась на системном уровне при вызове connect(). Если возвращенное errno — 0, но функция вернула FALSE, это — признак того, что ошибка произошла перед вызовом connect(). Это наиболее вероятно, из-за проблемы инициализации сокета. Имейте в виду, что аргументы errno и errstr необязательно должны упоминаться.

Если port — 0 и ОС поддерживает доменные сокеты Unix (domain sockets), hostname будет использован для подключения в качестве filename доменного сокета Unix.

По умолчанию сокет откроется в режиме blocking mode. Вы можете переключить его в non-blocking mode используя set_socket_blocking() .

Пример 1. fsockopen example

set_socket_blocking

Описание

int set_socket_blocking (int socket descriptor, int mode);


Если mode отсутствует, данный дескриптор сокета переключится на non-blocking режим, а если присутствует, то переключится на blocking режим. Это влияет на вызовы типа fgets() , который читает из сокета. В non-blocking режиме fgets() вызов всегда будет возвращаться немедленно, в то время как в blocking режиме он ждет данные, чтобы стать доступным на сокете.

gethostbyaddr

Описание

string gethostbyaddr (string ip_address);

Возвращает имя хоста Internet определенного аргументом ip_address . Если происходит ошибка, возвращается ip_address .

gethostbyname

Описание

string gethostbyname (string hostname);

Возвращает IP-адрес хоста, указанного аргументом hostname .

gethostbynamel

Описание

array gethostbynamel (string hostname);

Возвращает список IP-адресов на которых разрешен хост Internet, указанный аргументом hostname .

checkdnsrr

Описание

int checkdnsrr (string host, string [ type ]);

Ищет в DNS записи типа type , соответствующие аргументу host . Возвращает true, если обнаруживаются какие-либо записи ; Возвращает false, если не обнаружены никакие записи или если произошла ошибка.

type может быть любым из значений: A, MX, NS, SOA, PTR, CNAME, или ANY. По умолчанию — MX.

host может или быть адресом IP или именем хоста.

getmxrr

Описание

int getmxrr (string hostname, array mxhosts, array [ weight ]);

Ищет в DNS MX-записи, соответствующие hostname . Возвращает true если записи найдены; возвращает false если записей не найдено или произошла ошибка.

Список MX-записей может размещаться в массиве mxhosts . Если задано weight массива, то он может быть заполнен собранной информацией.

openlog

Описание

int openlog (string ident, int option, int facility);

openlog() открывает для программы соединение c system logger . Строка ident добавляется к каждому сообщению. Значение для option и facility даются в следующем разделе. Использование openlog() не обязательно; Это может быть автоматически вызвано вызовом syslog() если необходимо, в этом случае >false . См. также syslog() и closelog() .

syslog

Описание

int syslog (int priority, string message);

syslog() генерирует регистрационное сообщение, для system logger. priority — комбинация легкости и уровня, значения для которых даются в следующем разделе. А другой аргумент является отсылаемым сообщением, кроме того, два символа %m заменятся строкой сообщения ошибки (strerror) соответствующей значению errno .

Больше информации о средствах syslog можно обнаружить на man-страницах для syslog в Unix-системах.

В WindowsNT, сервис syslog эмулируется использованием Event Log.

closelog

Описание

int closelog (void);

closelog() закрывает дескриптор, используемый для записи в system logger. Использование closelog() необязательно.

debugger_on

Описание

int debugger_on (string address);

Разрешает внутренний PHP отладчик, соединяя его на address . Отладчик находится в стадии разработки.

debugger_off

Описание

int debugger_off (void);

Запрещает внутренний PHP отладчик. Отладчик находится в стадии разработки.

gethostbyname — Получает адрес IPv4, соответствующий переданному имени узла интернета

(PHP 4, PHP 5, PHP 7)

gethostbyname — Получает адрес IPv4, соответствующий переданному имени узла интернета

Описание

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

Список параметров

Возвращаемые значения

Возвращает адрес IPv4 или строку, содержащую неизмененный hostname при ошибке.

Примеры

Пример #1 Простой пример использования gethostbyname()

Смотрите также

  • gethostbyaddr() — Получает доменное имя узла, соответствующее переданному IP-адресу
  • gethostbynamel() — Возвращает список адресов IPv4, соответствующих переданному доменному имени узла
  • inet_pton() — Конвертирует читаемый IP адрес в упакованное in_addr представление
  • inet_ntop() — Конвертирует упакованный интернет адрес в читаемый формат

Как по IP узнать имя хоста

Что такое reverse DNS lookup?

Зная имя хоста с помощью DNS запроса (DNS lookup) можно узнать его IP. Но иногда нужно узнать имя хоста для которого известен IP адрес. Это называется reverse DNS lookup, можно перевести как обратное DNS преобразование или обратный DNS запрос.

В Linux обратное DNS преобразование можно сделать с помощью команды dig к которой добавлена опция -x:

В Windows и Linux также можно использовать команду nslookup:

Этот способ работает далеко не всегда! Он работает только если в базе данных Reverse DNS (обратного DNS) присутствует PTR запись.

Отсюда довольно важное практическое следствие: не нужно полагаться на полученное с помощью обратного DNS запроса имя хоста! Например, в контроле доступа к сайту в веб-сервере Apache можно настроить ограничения доступа исходя из имени обратившегося хоста. Нужно помнить, что не всегда возможно определить имя хоста (а оно определяется именно с помощью обратного DNS запроса!). Поэтому более надёжным способом является составление диапазонов IP, ассоциированных с определённым хостом и блокировка по IP.

Что такое PTR запись?

PTR (pointer — указатель) запись сопоставляет IP адрес с доменным именем. Она часто называется «reverse DNS entry» (обратная DNS запись), поскольку она преобразовывает IP адрес в имя.

PTR записи преимущественно используются в мерах безопасности и предотвращения спама для верификации, что адрес почтового сервера разрешён для отправки email от имени конкретного хоста. По обратной DNS записи проверяется, действительно ли имя сервера ассоциировано с IP адресом, с которого было инициировано соединение.

Чтобы внести обратную DNS запись, которая бы связывала IP адрес с вашим доменом, вам нужно обратиться к вашему провайдеру IP адреса для создания PTR записи для конкретного IP адреса.

Другие способы определения имени хоста по IP

Все другие способы основываются исходя из накопленных данных. То есть больше нет других баз данных, но некоторые сервисы накапливают очень большое количество информации. Примеры таких сервисов:

Gethostbynamel — получает список IP-адресов, соответствующих имени данного Internet-хоста.

gethostbynamel — получает список IP-адресов, соответствующих имени данного Internet-хоста.

Описание

array gethostbynamel (string hostname)

Возвращает список IP-адресов. в которые разрешается Internet-хост, специфицированный параметром hostname .


Назад Оглавление Вперёд
gethostbyname Вверх getmxrr

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Работа с DNS серверами в PHP


Здесь мы рассмотрим функции, которые предоставляет PHP для работы с DNS серверами. Наиболее часто возникает задача получения имени хоста по его IP-адресу, другие задачи встречаются значительно реже.

Функция gethostbyname

string gethostbyname(string hostname)

Пример использования фунции gethostbyname

= «localhost» ;
$ip_address = gethostbyname ( $hostname );
echo ( «IP-адрес $hostname: $ip_address» );
?>

Функция gethostbynamel

string gethostbynamel(string hostname)

Многие компьютеры имеют несколько IP-адресов, особенно типична такая ситуация для различных серверов. Получить полный список IP-адресов, соответствующих данному имени компьютера, можно с помощью функции gethostbynamel, действующей аналогично функции gethostbyname. Другая ситуация, в которой полезно применение этой функции, возникает, когда одно имя DNS соответствует нескольким компьютерам. Это бывает при работе с DNS серверами, поддерживающими механизм кругового распределения нагрузки, при котором одно имя DNS сервера отображается на несколько компьютеров в локальной сети этого сервера.

Возвращаемый список IP-адресов функция gethostbynamel помещает в массив:

= «localhost» ;
$ip_addresses = gethostbyname ( $hostname );
echo( «The IP adresses of ‘$hostName’ are:
» );
foreach( $ip_adresses as $index => $val )
<
echo( «$val» );
>
?>

Функция gethostbyaddr

Эта функция принимает в качестве аргумента IP-адрес и возвращает соответствующее ему имя хоста:

= «127.0.0.1» ;
$hostname = gethostbyaddr ( $ip_address );
echo ( «Имя хоста с IP-адресом $ip_address: $hostname» );
?>

Функция checkdnsrr

string checkdnsrr(string hostname [, string type])

DNS сервер сохраняет немало полезной информации о хосте, для чего используются так называемые записи ресурсов, которые имеют следующие типы:

  • A (Запись содержит IP-адрес хоста);
  • CNAME (Запись содержит псевдоним хоста);
  • NS (Запись содержит имя DNS-сервера, являющегося авторитетным для поддо-мена. Авторитетным является такой DNS-сервер, который замыкает цепочку DNS-запросов);
  • МХ (Запись содержит Имя хоста почтового ретранслятора в домене, которому принадлежит данный хост. В этой записи также хранится значение коэффициента предпочтения для почтового ретранслятора);
  • PTR (Запись хранит отображения IP-адресов в имена).

Функция checkdnsrr находит на DNS-сервере записи ресурсов вида type для хоста hostname.

Примечание

Эта функция не поддерживается на Windows-платформах.

Руководство по управлению системой: Сети и средства связи

Несмотря на то, что 32-разрядные IP-адреса позволяют однозначно идентифицировать все хосты в сети Internet, пользователям гораздо удобнее работать с осмысленными, легко запоминающимися именами хостов. В Протоколе управления передачей/Протоколе Internet (TCP/IP) предусмотрена система имен, поддерживающая как одноуровневую, так и иерархическую структуру сети.

Система присовения имен в однородной сети проста. Имена хостов состоят из простого набора символов, а удаленное управление хостами в этом случае, как правило, не используются. В однородных сетях TCP/IP в каждой системе сети есть файл ( /etc/hosts ), содержащий таблицу преобразования имен всех имеющихся хостов в IP-адреса. При расширении сети TCP/IP административные затраты по поддержанию в каждой системе файла с таблицей преобразования имен существенно возрастают. Если сеть TCP/IP становится очень большой (например, Internet), то необходимо переходить к иерархической структуре присвоения имен. Обычно иерархия имен соответствует структуре сети. В TCP/IP иерархическая система присвоение имен называется системой имен доменов (DNS) и использует протокол DOMAIN. Протокол DOMAIN реализован в TCP/IP демоном named .

Как и в случае с одноуровневыми сетями, иерархия имен доменов позволяет присваивать сетям и хостам осмысленные и легко запоминающиеся символьные имена. Однако, вместо того, чтобы хранить файл с таблицей преобразования имен в IP-адреса на каждом хосте, выбирается один или несколько хостов, которые применяются в качестве серверов имен . Серверы имен преобразуют символьные имена сетей и хостов в IP-адреса. На сервере имен хранится полная информация об определенной части домена, называемой областью . Кроме того, сервер несет ответственность за свою область.

В одноуровневой сети администрирование всех входящих в нее хостов осуществляется централизованно. Такая структура сети требует присвоения всем хостам сети уникальных имен. Если сеть большая, то это требование создает большие трудности для администратора сети.

В доменной сети администрирование выполняется отдельно для каждой группы хостов в соответствии с иерархией доменов и субдоменов. В этом случае имена хостов должны быть уникальными только в пределах локального домена, а централизованное администрирование осуществляется только для корневого домена . Такая структура допускает локальное администрирование субдоменов и сокращает нагрузку на организацию, осуществляющую централизованное управление. Например, корневой домен сети Internet состоит из доменов, com (коммерческие организации), edu (образовательные учреждения), gov (правительственные организации) и mil (военные учреждения). Новые домены верхнего уровня могут добавляться только централизованно. Присваивать имена на втором уровне разрешено уполномоченным представителям внутри соответствующих доменов. Например, уполномоченная организация на уровне домена com может присваивать имена всем входящим в него субдоменам коммерческих организаций. Аналогично, присвоение имен на третьем и последующих уровнях разрешено соответствующим организациям. Например, на рисунке «Структура домена Internet» домен Century уполномочен распределять имена в субдоменах Austin, Hopkins и Charlotte.

Рис. 3-21. Структура имен доменов в Internet . На рисунке показана иерархическая структура сети Internet. Он начинается с корневого узла и разделяется на следующем уровне на домены mil, com и edu. На следующем уровне ветви com находятся домены Charlotte, Austin и Hopkins. В домене Austin находятся домены Dev и Graphics.

Субдомен Austin домена Century может быть, в свою очередь, разделен на две области, например, Dev и Graphics. В этом случае область austin.century.com должна включать все данные, относящиеся к домену austin.century.com , за исключением тех, которые относятся к областям Dev и Graphics. Область dev.century.com должна содержать только данные, относящиеся к Dev; она никак не связана, например, с областью Graphics. Область austin.century.com (в отличие от домена с тем же именем) должна содержать только те данные, которые не относятся к другим областям.

В иерархической системе имен доменов каждое имя представляет собой последовательность имен (без учета регистра символов), разделенных точками без промежуточных пробелов. В протоколе DOMAIN длина имени локального домена ограничена 64 символами, а длина имени хоста — 32 символами. Имя хоста указывается первым, после него ставится точка (.), затем идет последовательность имен локальных доменов, разделенных точками, и в конце указывается имя корневого домена. Полное имя хоста, включая точки, должно содержать не более 255 символов и иметь следующий вид:

Так как в пределах домена хосты имеют уникальные имена, то при отправке сообщений на хост, находящийся внутри того же домена, можно использовать сокращенное имя. Например, при отправке сообщения с хоста, находящегося в домене eng , вместо имени smith.eng.lsu.edu можно указать имя smith . Кроме того, у каждого хоста может быть несколько псевдонимов, и другие хосты могут использовать их при отправке сообщений.

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

Вот несколько рекомендаций по выбору простых и легких для запоминания имен:

  • Выбирайте редко используемые слова, например, sphinx или eclipse .
  • Используйте тематические наборы имен, например названия химических элементов (такие как helium , argon или zinc ), цветов, рыб и т.п.
  • Используйте реально существующие слова, а не случайные наборы символов.

Ниже приведено несколько примеров неудачного выбора. В общем случае они или трудны для запоминания, или сбивают с толку (и человека, и компьютер):

  • Широко используемые термины, например, up , down или crash .
  • Имена, состоящие только из чисел.
  • Имена, содержащие знаки препинания.
  • Имена, различающиеся регистром символов, например, Orange и orange .
  • Имя или инициалы основного пользователя системы.
  • Имена длиной более 8 символов.
  • Имена с необычным или намеренно неправильным написанием. Например czek легко можно перепутать с «check» или «czech.»
  • Имена, совпадающие с именем домена, например yale.edu .

В одноуровневой сети без сервера имен имена всех хостов хранятся в файле /etc/hosts каждого хоста сети. В больших сетях хранение и обновление таких файлов требует слишком большого объема ресурсов.

В иерархической сети задача преобразования имен всех хостов в IP-адреса возложена на определенные хосты, называемые серверами имен . Такая структура имеет ряд преимуществ. Для преобразования имен не используются ресурсы каждого хоста, а администратор системы освобождается от обязанности создавать и обновлять в каждой системе сети файлы с таблицами преобразования имен. Набор имен, которым управляет какой-либо сервер, называется его областью ответственности .

Примечание: Хост, выполняющий преобразование имен в области ответственности, обычно называют сервером имен , но на самом деле преобразование осуществляется процессом сервера с именем named .

Для снижения нагрузки на сеть все серверы имен в течение определенного времени хранят адреса, полученные с других серверов, в кэше . Когда клиент обращается к серверу с запросом на преобразование имени, сервер сначала просматривает свою кэш-память и определяет, не преобразовывал ли он уже это имя. Так как имена доменов и хостов могут изменяться, то каждый элемент остается в кэш-памяти в течение ограниченного времени, которое определяется параметром времени хранения в кэше (TTL). Таким образом, в пределах области ответственности можно задать период времени, на протяжении которого выполняется точное преобразование имен.

В автономных системах может применяться несколько серверов имен. Обычно серверы имен имеют иерархию, соответствующую структуре сети. На рисунке «Структура доменов Internet» в каждом домене может быть сервер имен, ответственный за все его субдомены. Сервер имен каждого субдомена связан с сервером имен домена более высокого уровня (с родительским сервером имен), а также с серверами имен других субдоменов.

Рис. 3-22. Структура имен доменов в Internet . На рисунке показана иерархическая структура сети Internet. Он начинается с корневого узла и разделяется на следующем уровне на домены mil, com и edu. На следующем уровне ветви com находятся домены Charlotte, Austin и Hopkins. В домене Austin находятся домены Dev и Graphics.

Например, на рисунке «Структура доменов Internet» субдомены Austin, Hopkins и Charlotte входят в состав домена Century. Если следовать иерархии организации сети, то сервер имен Austin должен взаимодействовать с серверами имен Charlotte и Hopkins, а также с родительским сервером имен Century. Кроме того, сервер имен Austin будет взаимодействовать с серверами имен других субдоменов.

Существует несколько типов серверов имен:

Главный сервер имен Загружает свои данные из файла или с диска и может передавать полномочия другим серверам в своем домене.
Подчиненный сервер имен Во время загрузки системы получает с главного сервера информацию о выделенной ему области ответственности, а затем периодически обращается к главному серверу для обновления этой информации. По истечении периода обновления, указанного в записи ресурса начала области ответственности (SOA) на подчиненном сервере имен, а также при получении уведомляющего сообщения от главного сервера, подчиненный сервер заново загружает базу данных с главного сервера, если порядковый номер базы данных на главном сервере больше, чем ее порядковый номер на подчиненном сервере. Если необходимо принудительно передать с главного сервера новую информацию об области ответственности, достаточно просто удалить существующие базы данных с подчиненного сервера и обновить на нем программу-демон named .
Сервер имен Stub Способ копирования базы данных этим сервером аналогичен применяемому подчиненным сервером имен, однако этот сервер копирует только отдельные записи сервера базы данных главного сервера, а не всю базу данных.
Сервер подсказок Это сервер имен, который отвечает на запросы только на основании данных, полученных им в результате предыдущих обращений к другим сервером имен. Если в кэш-памяти сервера нет записей преобразования имен в адреса, то для ответа на запросы он обращается к другим серверам.
Клиент или сервер пересылки Этот сервер пересылает перечисленным серверам те запросы, которые он не может обработать самостоятельно. Серверы, предназначенные только для пересылки, только получают информацию и передают ее другим. Они не взаимодействуют с главными серверами имен корневого и других доменов. Для обращения к серверам пересылки используются рекурсивные запросы. Может быть определено несколько серверов пересылки, обращение к которым происходит по очереди, до тех пор, пока не исчерпается список. Серверы пересылки обычно применяются в том случае, когда вы не хотите, чтобы все серверы данной сети взаимодействовали с остальными серверами Internet, или когда необходимо создать на серверах имен кэш-память большого объема.
Удаленный сервер Выполняет все сетевые программы, использующие сервер имен; при этом процесс сервера имен на локальном хосте не запускается. Все запросы обслуживаются сервером имен, работающим в другой системе.

Один и тот же хост может выполнять функции нескольких серверов имен с различными областями ответственности. Например, он может быть главным сервером имен для одной области и подчиненным сервером имен — для другой.

Процесс определения IP-адреса по имени хоста называется преобразованием имен и выполняется процедурой gethostbyname . Процесс получения имен хостов на основании известных IP-адресов называется обратным преобразованием имен и выполняется процедурой gethostbyaddr . Эти процедуры входят в состав библиотеки, содержащей все необходимые функции преобразования .

Для определения IP-адресов хостов в сети используются следующие источники:

  1. Сервер BIND/DNS (named)
  2. Служба информации о сети (NIS)
  3. Локальный файл /etc/hosts

Если установлена NIS+, параметры поиска настраиваются с помощью файла irs.conf . Более подробная информация приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide .

Для преобразования имен в сети с иерархической структурой доменов процедуры преобразования сначала обращаются к базе данных сервера имен доменов, которая может быть локальной, если хост сам является сервером имен доменов, или может находиться на удаленном хосте. Серверы имен преобразуют имена доменов в IP-адреса. Группа имен, за которые отвечает сервер имен, называется его областью ответственности. Если в процедуре обработки появилось имя удаленного сервера имен, то она отправляет запрос процедуры преобразования по протоколу имен доменов (DOMAIN). Для преобразования имени в простой сети процедура преобразования выбирает запись из локального файла /etc/hosts . При использовании NIS или NIS+ выполняется проверка файла /etc/hosts на главном сервере.

По умолчанию процедуры преобразования используют средства, перечисленные выше. Сначала применяется BIND/DNS. Если файл /etc/resolv.conf отсутствует или если BIND/DNS не может выполнить преобразование, процедура обращается к NIS (если эта служба доступна). Так как служба NIS имеет более высокий приоритет, чем локальный файл /etc/hosts , то на этом поиск может завершиться. Если служба NIS недоступна, то процедура преобразования выполняет поиск в локальном файле /etc/hosts . Если ни одно из этих средств не позволило определить имя, то процедура преобразования выдаст сообщение ХОСТ_НЕ_НАЙДЕН. Если ни одна из служб не доступна, процедура выдаст сообщение СЛУЖБА_НЕДОСТУПНА.

Описанный выше порядок действий по умолчанию можно изменить, создав файл /etc/irs.conf и задав в нем требуемую последовательность выполнения процедур. Кроме того, порядок действий по умолчанию и порядок, определенный в файле /etc/irs.conf , можно изменить с помощью переменной среды NSORDER . Если задан файл /etc/irs.conf и переменная среды NSORDER , то необходимо задать хотя бы одно значение параметра.

Задание порядка поиска хостов с помощью файла /etc/irs.conf :

Порядок поиска задается путем перечисления возможных способов, по одному способу на строке. Значение — это один из способов, приведенных в списке, а ключевое слово continue указывает, что другой способ преобразования задан в следующей строке.

Задание порядка поиска хостов с помощью переменной среды NSORDER :

Порядок задается в одной строке, значения разделяются запятыми. Между запятыми и знаком равенства можно ставить пробел.

Например, в одноуровневой локальной сети необходим только файл /etc/hosts . В этом примере файл /etc/irs.conf будет содержать следующую строку:

В качестве альтернативы можно задать переменную среды NSORDER :

Если локальная сеть состоит из доменов и при этом в ней используется сервер имен, а в файле /etc/hosts хранится резервная таблица хостов, то необходимо задать использование обеих служб. В этом примере файл /etc/irs.conf будет содержать следующие строки:

Переменная среды NSORDER должна быть задана так:

Примечание: В параметрах следует указывать символы в нижнем регистре.

При любой последовательности преобразования переход к следующему методу выполняется при следующих условиях:

  • Текущая служба не запущена, и поэтому недоступна.
  • Текущая служба не смогла найти имя и не помечена как «ответственная».

Если файл /etc/resolv.conf не существует, службы BIND/DNS считаются недоступными. Если процедуры getdomainname и yp_bind не выполнены, то считается, что служба NIS не настроена или не работает и потому недоступна. Если файл /etc/hosts невозможно открыть, то локальный поиск невозможен, а следовательно, этот файл и эта служба недоступны.

Если служба в списке помечена как ответственная (authoritative) , значит достоверность передаваемой ею информации выше, чем у служб, находящихся в иерархии ниже ее, и она должна содержать все имена и адреса. Процедуры преобразования не будут обращаться к последующим службам, так как они содержат только часть информации, предоставляемой данной службой. Процедура преобразования завершает работу на уровне службы, помеченной как «ответственная», даже если она не нашла запрошенное имя (в этом случае процедура преобразования выдаст сообщение ХОСТ_НЕ_НАЙДЕН). Если ответственная служба недоступна, то процедура обращается к следующей службе.

Ответственный источник отмечен строкой =auth после значения. Может быть полностью указано слово authoritative , однако используется только часть auth . Например, если переменной среды NSORDER присвоено значение:

При получении ответа от NIS поиск будет завершен, даже если имя не будет найдено. Если служба NIS не работает, то процедура преобразования обратится к DNS.

Для более эффективного поиска имен хостов и сетей серверы имен TCP/IP используют кэш-память. Вместо того, чтобы выполнять поиск имени хоста при получении каждого запроса, сервер имен сначала просматривает свою кэш-память и определяет, не преобразовывал ли он уже это имя хоста. Так как имена доменов и хостов могут изменяться, то каждый элемент остается в кэш-памяти в течение ограниченного времени, которое определяется параметром времени хранения в кэше (TTL). Таким образом, для сервера имен можно задать период времени, на протяжении которого его ответы могут считаться достоверными.

В среде DNS имя хоста, которое задается с помощью команды hostname в командной строке или в файле rc.net , должно быть официальным именем хоста, известным серверу имен. В общем случае это полное имя хоста в следующем формате:

Примечание: Для работы процедур преобразования необходимо задать имя домена по умолчанию. Если имя домена по умолчанию в команде hostname не указано, то оно должно быть задано в файле /etc/resolv.conf .

Если имя хоста задано в краткой форме, а также если система настроена на использование сервера имен доменов совместно с программой sendmail , то в файле конфигурации программы sendmail (файл /etc/sendmail.cf ) необходимо указать официальное имя хоста. Кроме того, для правильной работы программы sendmail в этом файле конфигурации нужно задать макроопределение имени домена.

Примечание: Для всех функций программы sendmail домен, описанный в файле /etc/sendmail.cf , имеет более высокий приоритет, чем домен, заданный командой hostname .

Для хоста, не являющего сервером имен, имена локального домена и сервера имен задаются в файле /etc/resolv.conf . Для сервера имен домена локальный домен и другие серверы имен задаются в файлах, которые демон named считывает при запуске.

Протокол обратного преобразования адресов (RARP) преобразует уникальные аппаратные адреса адаптеров сети Ethernet в IP-адреса. Стандартный протокол Ethernet поддерживается со следующими ограничениями:

  • Сервер отвечает на запросы RARP.
  • Сервер использует только записи постоянной таблицы ARP.
  • Сервер не использует записи постоянной таблицы ARP.
  • Сервер не отвечает на запросы автоматически.

Системный администратор должен вручную создать и обновлять таблицу постоянных записей с помощью команды arp . На сервере необходимо добавить в таблицу ARP запись для каждого хоста, который требует ответов RARP от ответственного источника.

В небольшой одноуровневой сети достаточно настроить файл /etc/hosts . В случае организации иерархической (доменной) схемы присвоения имен и применения серверов имен файл /etc/hosts может потребоваться для идентификации тех хостов, которые неизвестны серверам имен.

Настроить систему для локального преобразования имен хостов можно с помощью Web-администратора системы, Инструмента управления системой (SMIT), а также с помощью специальных команд. При настройке с помощью команд постарайтесь сохранить формат файла /etc/hosts , описанный в разделе Hosts File Format for TCP/IP в книге AIX 5L Version 5.1 Files Reference .

Задачи по локальному преобразованию имен
Процедура Команда быстрого доступа из SMIT Команда или имя файла Среда Web-администратора системы
Показать список всех хостов smit lshostent view /etc/hosts Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную Файл hosts Содержимое файла /etc/hosts .
Добавить хост smit mkhostent edit /etc/hosts Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную Файл hosts . В окне Добавить/изменить запись для хоста заполните следующие поля: IP-адреса , Имя хоста , Псевдонимы и Комментарий . Щелкните на Добавить/изменить запись OK .
Изменить/показать параметры хоста smit chhostent edit /etc/hosts Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную Файл hosts . Выберите хост в списке Содержимое файла /etc/hosts и измените данные в поле Добавить/изменить запись о хосте . Щелкните на Добавить/изменить запись OK .
Удалить хост smit rmhostent edit /etc/hosts Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную Файл hosts . Выберите хост в списке Содержимое файла /etc/hosts и щелкните на Удалить запись OK .

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

Ниже приведены рекомендации по планированию системы DOMAIN:

  • Для полноценного использования всех возможностей системы рекомендуется хорошо изучить TCP/IP, DNS и BIND. Если вы планируете применять службы информации о сети, то ознакомьтесь также с NFS и NIS. Существует огромное количество книг, посвященных этим вопросам. Более подробная информация о NIS и NIS+ приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide .
  • Учитывайте будущие потребности.



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

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

  • При выборе серверов имен учитывайте следующие особенности:
    • Выбирайте компьютеры, которые физически находятся ближе других к внешним системам.
    • Серверы имен должны быть как можно более автономными. Постарайтесь подключить их к отдельным источникам питания и независимым кабельным системам.
    • Храните резервные копии данных вашей службы преобразования имен в другой сети и не отказывайте в аналогичной услуге администраторам других сетей.
  • Проверяйте работу серверов.
    • Проверяйте как прямое, так и обратное преобразование имен.
    • Проверяйте передачу информации об областях ответственности от главного к подчиненным серверам имен.
    • Проверяйте каждый сервер имен после сбоя или перезагрузки системы.
  • Прежде чем отправлять запросы на преобразование имен на внешние серверы, направляйте их на серверы пересылки. Это позволит серверам имен совместно использовать кэш-память и повысит эффективность работы за счет снижения нагрузки на главные серверы имен.
  • В иерархической сети некоторые хосты выполняют функции серверов имен . Эти хосты преобразуют имена других хостов в IP-адреса. Работой сервера имен управляет программа-демон named , которая должна быть запущена на хосте — сервере имен.

    Перед настройкой определите, какие типы серверов имен лучше всего подходят для обслуживания вашей сети. Существует несколько типов серверов имен.

    Главный сервер имен хранит базу данных с таблицами преобразования имен в адреса. Он загружает свои данные из файла или с диска и может передавать полномочия другим серверам своего домена. Подчиненный сервер имен или сервер имен Stub получает информацию об области ответственности от главного сервера имен во время запуска системы, а затем периодически обращается к главному серверу для обновления этой информации. Сервер подсказок отвечает на запросы о преобразовании имени с помощью информации, полученной им от других серверов.

    Примечание: В предыдущих версиях сервера имен named главный сервер имен определялся как основной, подчиненный сервер имен — как дополнительный, а сервер подсказок — как сервер кэш-памяти. Все ссылки на файл named.conf в данном руководстве соответствуют AIX версии 4.3.2 и выше.

    Помните, что один и тот же сервер имен может выполнять разные функции в различных областях ответственности. Например, он может быть главным сервером имен для одной области и подчиненным — для другой. Если в вашей системе установлена NIS или NIS+, то эти службы также выполняют преобразование имен. Более подробная информация приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide .

    Параметры серверов имен задаются в нескольких файлах.

    conf Этот файл считывается при запуске демона named . Записи файла conf сообщают программе named тип сервера, задают список доменов, входящих в область его ответственности, и указывают, откуда следует брать данные для первоначального заполнения базы данных сервера. По умолчанию этот файл называется /etc/named.conf . Вы можете изменить это имя, задав новое имя и путь в командной строке при запуске программы named . Если вы укажете несуществующий файл конфигурации с именем /etc/named.conf , то в протокол syslog заносится сообщение, а работа демона named завершается. Однако если указан несуществующий альтернативный файл конфигурации, то сообщение не создается, и программа named продолжает работу.
    cache Содержит информацию о локальной кэш-памяти. Файл локальной кэш-памяти содержит имена и адреса серверов с наибольшей областью ответственности. Файл кэш-памяти имеет стандартный формат записи ресурса. Имя файла кэш-памяти задается в файле conf .
    данные о домене Существует три типа файлов данных о домене, называемых также файлами данных named . Локальный файл named содержит информацию о преобразовании локальных циклических адресов. Файл данных named содержит данные о преобразовании имен для всех систем, находящихся в области ответственности сервера имен. Файл данных для обратного преобразования named содержит данные об обратном преобразовании адресов для систем, находящихся в области ответственности сервера. Файлы данных о домене используют стандартный формат записи ресурса. Имена этих файлов задаются пользователем и указываются в файле conf . Общепринято, чтобы в имена этих файлов включалось имя демона named , а в расширение — тип файла и имя домена. Например, сервер имен для домена abc должен иметь следующие файлы:

    При внесении изменений в файлы данных named порядковый номер записи ресурса SOA для подчиненных серверов имен должен быть увеличен, чтобы правильно отражать новую область ответственности.

    resolv.conf Наличие этого файла сообщает хосту, что для преобразования имен он сначала должен обращаться к серверу имен. Если файл resolv.conf отсутствует, то для преобразования имен хост просматривает файл /etc/hosts . На сервере имен должен существовать файл resolv.conf , который может содержать адрес локального хоста, циклический адрес (127.0.0.1), или может быть пустым.

    Примечание: Для работы процедуры преобразования должно быть задано имя домена по умолчанию. Если домен по умолчанию не указан в файле /etc/resolv.conf , то он должен быть задан в файле hostname .

    Время хранения в кэш-памяти (TTL) задается в записях ресурсов. Если в записи ресурса параметр TTL не указан, то по умолчанию он устанавливается равным минимальному значению, заданному для данной области в записи начала области ответственности (SOA). Параметр TTL используется в том случае, когда данные хранятся вне области ответственности (в кэш-памяти), при этом вы можете быть уверены, что время хранения данных будет ограничено.

    Для настройки главного сервера имен вызовите Web-администратор системы ( wsm ), запустите демон named из командной строки, либо воспользуйтесь следующей процедурой, в ходе которой изменяется ряд файлов и используется программа SMIT.


      Внесите необходимые изменения в файл /etc/named.conf . Если в каталоге /etc нет файла named.conf , скопируйте файл /usr/samples/tcpip/named.conf в каталог /etc и отредактируйте его. Более подробная информация и примеры файла конфигурации приведены в разделе named.conf File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference .

    Этот файл считывается при каждом запуске демона named . В нем указывается тип сервера, область (или области) его ответственности и источник для загрузки начальной информации.


      Если это необходимо, задайте с помощью оператора options каталог, в котором расположены файлы данных named . Например:

    Если вы хотите, чтобы данные сервера имен заносились в кэш вне определенных зон, то укажите имя файла дополнительной информации. Например:

    Задайте число областей. Для настройки сервера в качестве главного сервера области, опишите каждую область и задайте для нее файл данных о домене. Например, главный сервер для областей прямого и обратного преобразования может быть описан так:

    Задайте имя локального файла named . Например:

    Отредактируйте файл /etc/named.ca . В разделе DOMAIN Cache File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша.

    В этом файле указаны адреса ответственных (или корневых ) серверов локального домена. Например:

    Задайте запись сервера имен (NS). Например:

    Задайте запись указателя (PTR).

    Включите информацию о преобразовании имен в адреса для всех хостов, находящихся в области ответственности сервера имен. Например:

    Внесите записи серверов имен для всех главных серверов имен в области. Например:

    Внесите другие необходимые типы записей, например, записи канонических имен или записи систем обмена почтой.

    Внесите информацию о преобразовании адресов в имена для всех хостов, находящихся в области ответственности сервера имен.

    Внесите другие необходимые типы записей, например, записи имен хостов и записи серверов имен.

    Наличие этого файла указывает хосту, что при преобразовании имен он должен использовать сервер имен, а не файл /etc/hosts . Этот файл должен существовать на сервере имен и может содержать адрес локального хоста, циклический адрес (127.0.0.1) или быть пустым.

    В другом варианте файл /etc/resolv.conf может содержать запись:

    127.0.0.1 — это циклический адрес, по которому хост обращается к самому себе, как к серверу имен. Файл /etc/resolv.conf может также содержать примерно следующую запись:

    В предыдущем примере значение имени_домена равно aus.century.com .

  • Выполните одно из следующих действий:
    • Запустите демон named с помощью программы SMIT: smit stnamed . Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Укажите, будете ли вы запускать программу named сейчас, при следующем запуске системы или в обоих случаях.
    • Внесите необходимые изменения в файл /etc/rc.tcpip . Удалите символ комментария в строке запуска демона named :

    Эта команда указывает, что демон должен инициализироваться при каждом запуске системы.

    Если вы не хотите инициализировать программу named с помощью SMIT, запустите ее для данного сеанса с помощью команды

    Для настройки подчиненного сервера имен можно воспользоваться Web-администратором системы ( wsm ) или следующей процедурой, в рамках которой сначала нужно отредактировать несколько файлов, а затем запустить демон named с помощью Инструмента управления системой (SMIT) или из командной строки.


      Внесите необходимые изменения в файл /etc/named.conf . Если в каталоге /etc нет файла named.conf , скопируйте файл /usr/samples/tcpip/named.conf в каталог /etc и отредактируйте его. Более подробная информация и примеры файла conf приведены в разделе named.conf File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference .

    Файл conf считывается при каждом запуске демона named . В нем указывается тип сервера, область его ответственности и источник для загрузки начальной информации.


      Если это необходимо, задайте с помощью оператора options каталог, в котором расположены файлы данных named . Например:

    Если вы хотите, чтобы данные сервера имен заносились в кэш вне определенных зон, то укажите имя файла дополнительной информации. Например:

    Задайте области ответственности подчиненного сервера. Каждый раздел включает тип области, необязательное имя файла, в котором сервер имен хранит резервную копию своих данных, и список IP-адресов главных серверов. В этом списке адресов указаны хосты, с которых будет получаться информация об области. Например:

    Введите операторы области ответственности подчиненного сервера, задающие информацию об обратном преобразовании. Например:

    Для поддержки преобразования циклического сетевого адреса определите область с типом master с источником /etc/named.local , а также домен, за который отвечает сервер имен.

    Отредактируйте файл /etc/named.ca . В разделе DOMAIN Cache File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша.

    В этом файле содержатся адреса ответственных серверов (NS) для корневого домена сети. Например:

    Задайте запись сервера имен (NS). Например:

    Задайте запись указателя (PTR).

    Наличие этого файла указывает хосту, что при преобразовании имен он должен использовать сервер имен, а не файл /etc/hosts . Вы также можете задать записи, определяющие имя, домен и адрес сервера имен.

  • Выполните одно из следующих действий:
    • Запустите демон named с помощью программы SMIT: smit stnamed . Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Укажите, будете ли вы запускать программу named сейчас, при следующем запуске системы или в обоих случаях.
    • Внесите необходимые изменения в файл /etc/rc.tcpip . Удалите символ комментария в строке запуска демона named :

    Эта команда указывает, что демон должен инициализироваться при каждом запуске системы.


    Если вы не хотите инициализировать программу named с помощью SMIT, запустите ее для данного сеанса с помощью команды

    Для настройки сервера подсказок (или кэш-сервера) можно воспользоваться Web-администратором системы ( wsm ) или следующей процедурой, в рамках которой нужно сначала отредактировать некоторые файлы, а затем запустить демон named с помощью программы SMIT или из командной строки.

    Для настройки сервера подсказок выполните следующие действия:


      Внесите необходимые изменения в файл /etc/named.conf . Если в каталоге /etc нет файла named.conf , скопируйте файл /usr/samples/tcpip/named.conf в каталог /etc и отредактируйте его. Более подробная информация и примеры файла conf приведены в разделе named.conf File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference .

        Для поддержки преобразования циклического сетевого адреса определите область с типом master с источником /etc/named.local , а также домен, за который отвечает сервер имен. Например:

    Укажите файл кэша для области подсказок. Например:

    Отредактируйте файл /etc/named.ca . В разделе DOMAIN Cache File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша.

    В этом файле содержатся адреса ответственных серверов корневого домена сети. Например:

    Задайте запись сервера имен (NS). Например:

    Задайте запись указателя (PTR).

    Наличие этого файла указывает хосту, что при преобразовании имен он должен использовать сервер имен, а не файл /etc/hosts . При желании вы можете задать записи, определяющие имя, домен и адрес сервера имен.

  • Выполните одно из следующих действий:
    • Запустите демон named с помощью программы SMIT: smit stnamed . Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Укажите, будете ли вы запускать программу named сейчас, при следующем запуске системы или в обоих случаях.
    • Внесите необходимые изменения в файл /etc/rc.tcpip . Удалите символ комментария в строке запуска демона named :

    Эта команда указывает, что демон должен инициализироваться при каждом запуске системы.

    Если вы не хотите инициализировать программу named с помощью SMIT, запустите ее для данного сеанса с помощью команды

    Почтовый сервер упрощает передачу сообщений пользователям вашей организации из внешней сети. Если такого сервера нет, то в почтовом адресе должен указываться конкретный хост в сети организации. Например, sam@orange.widget.com , где widget.com — имя домена вашей организации, а orange — хост, который использует sam . При наличии почтового сервера внешним пользователям достаточно указать только имя адресата (без имени хоста, который он использует) и имя домена вашей организации, например, sam@widget.com .

    Для настройки почтового сервера воспользуйтесь Web-администратором системы ( wsm ) или одной из следующих процедур.

    1. Создайте для почтового сервера black.widget.com запись системы обмена почтой (MX) и запись адреса (A):

    Добавьте в файл sendmail.cf на почтовом сервере ( black.widget.com ) псевдоним домена (класс w ):

    Укажите почтовым клиентам, куда они должны направлять сообщения, адресованные во внешние сети. Для этого в файле sendmail.cf каждого клиента задайте ссылку на почтовый сервер (макрокоманда S ):

  • При настройке демона sendmail задайте параметр NameServOpt , чтобы каждый клиент мог использовать записи MX сервера имен brown.widget.com .
  • Добавьте в файл псевдонимов псевдонимы для пользователей, у которых нет учетных записей на почтовом сервере, например:

    Примечание: Такую же функцию могут выполнять записи почтового ящика (MB).

    Есть и другие способы настройки почтового сервера доменов. В приведенных ниже процедурах используются записи MB (почтовый ящик), MR (переименование почты) и MG (почтовая группы).

    1. Задайте запись почтового ящика (MB) для каждого пользователя домена. Добавьте записи

    в файл /etc/named.data на хосте brown.widget.com . Такие записи сообщают почтовому серверу black.widget.com , куда следует направлять почту для каждого пользователя в домене.

  • Укажите, что демон sendmail на почтовом сервере black.widget.com должен использовать записи MB, заданные на сервере имен brown.widget.com . Воспользуйтесь параметром NameServOpt .
  • Так как в базу данных были внесены изменения, увеличьте порядковый номер в записи ресурса SOA.
  • Обновите базу данных сервера имен с помощью команды refresh -s named .
  • Выполните команду sendmail -bz для перекомпиляции файла sendmail.cf на почтовом сервере, а затем введите команду refresh -s sendmail , чтобы изменения вступили в силу.
    1. Отредактируйте файл /etc/named.data на сервере имен доменов.
    2. Добавьте запись переименования почты для каждого псевдонима. Например, если пользователь sam имеет псевдоним sammy , то запись переименования почты будет выглядеть так:

    Задание такой записи приведет к тому, что все почтовые отправления, адресованные sammy , будут доставляться пользователю sam . Каждая запись MR должна задаваться в отдельной строке.

  • Так как в базу данных были внесены изменения, необходимо увеличить порядковый номер в записи ресурса SOA.
  • Обновите базу данных сервера имен с помощью команды refresh -s named .
  • Выполните команду sendmail -bz для перекомпиляции файла sendmail.cf на почтовом сервере, а затем введите команду refresh -s sendmail , чтобы изменения вступили в силу.
    1. Отредактируйте файл /etc/named.data на сервере имен доменов.
    2. Добавьте записи MG для всех почтовых групп. Записи MG работают так же, как файл /etc/aliases , но псевдонимы хранятся на сервере имен. Например:

    В этом случае все почтовые сообщения, направляемые по адресу users@widget.com , будут доставляться пользователям sam , david и judy . Каждая запись MG должна задаваться в отдельной строке.

    Примечание: Для пользователей sam , david и judy должны быть заданы записи MB.

    1. Отредактируйте файл /etc/named.data на сервере имен доменов.
    2. Добавьте записи MX для всех компьютеров, с которыми вы хотели бы обмениваться почтой, и которые не подключены непосредственно к вашей сети. Например, если почту отправляемую по адресу purple.widget.com , нужно пересылать по адресу post.office.widget , запись MX должна выглядеть так:

    В записях MX нужно задавать как имя хоста, так и имя компьютера. Каждая запись MG должна задаваться в отдельной строке. Можно использовать символы подстановки, например:

    В этом примере почта, поступающая на неизвестный хост (хост без заданной явно записи MX) домена widget.com , будет пересылаться по адресу post.office.widget .

    Примечание: Записи MX с символами подстановки нельзя использовать в сети Internet.

    Для настройки сервера пересылки можно воспользоваться Web-администратором системы ( wsm ) или следующей процедурой, в рамках которой нужно сначала отредактировать некоторые файлы, а затем запустить демон named с помощью программы SMIT или из командной строки.


      Внесите необходимые изменения в файл /etc/named.conf . Если в каталоге /etc нет файла named.conf , скопируйте файл /usr/samples/tcpip/named.conf в каталог /etc и отредактируйте его. Более подробная информация и примеры файла конфигурации приведены в разделе «named.conf File Format for TCP/IP» книги AIX 5L Version 5.1 Files Reference .

        Задайте серверы пересылки в строке forwarders файла /etc/named.conf . В этой строке нужно указать IP-адреса серверов имен, на которые нужно пересылать запросы. Например:

    Задайте область подсказок. Например:

    Отредактируйте файл /etc/named.ca . В разделе «DOMAIN Cache File Format for TCP/IP» книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша.

    В этом файле содержатся адреса ответственных серверов корневого домена сети. Например:

    Примечание: Все строки в этом файле должны иметь стандартный формат записи ресурса.

    Задайте запись сервера имен (NS). Например:

    Задайте запись указателя (PTR).


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

    В другом варианте файл /etc/resolv.conf может содержать запись:

    127.0.0.1 — это циклический адрес, по которому хост обращается к самому себе, как к серверу имен. Файл /etc/resolv.conf может содержать и такие записи:

    В предыдущем примере в качестве параметра имя_домена было указано значение austin.century.com .

  • Выполните одно из следующих действий:
    • Запустите демон named с помощью программы SMIT: smit stnamed . Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Укажите, будете ли вы запускать программу named сейчас, при следующем запуске системы или в обоих случаях.
    • Внесите необходимые изменения в файл /etc/rc.tcpip . Удалите символ комментария в строке запуска демона named :

    Эта команда указывает, что демон должен инициализироваться при каждом запуске системы.

    Если вы не хотите инициализировать демон named с помощью SMIT, запустите его для данного сеанса с помощью команды

    Для настройки сервера пересылки можно воспользоваться Web-администратором системы ( wsm ) или следующей процедурой, в рамках которой нужно сначала отредактировать некоторые файлы, а затем запустить демон named с помощью программы SMIT или из командной строки.

    Примечание: Вы можете получить такую же конфигурацию, не запуская сервер пересылки. Вместо этого создайте файл /etc/resolv.conf , в котором задайте строки сервера имен с указанием требуемых серверов пересылки.

    1. Внесите необходимые изменения в файл /etc/named.conf . Если в каталоге /etc нет файла named.conf , скопируйте файл /usr/samples/tcpip/named.conf в каталог /etc и отредактируйте его. Более подробная информация и примеры файла conf приведены в разделе named.conf File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference .
      • В разделе опций файла /etc/named.conf задайте серверы пересылки в строке forwarders, и серверы только для пересылки в строке forward only, указав IP-адреса серверов имен, которым должны пересылаться запросы. Например:

    Отредактируйте файл /etc/named.ca . В разделе DOMAIN Cache File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша. В этом файле содержатся адреса ответственных серверов корневого домена сети. Например:

    Примечание: Все строки в этом файле должны иметь стандартный формат записи ресурса.

    Задайте запись сервера имен (NS). Например:

    Задайте запись указателя (PTR).

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

    В другом варианте файл /etc/resolv.conf может содержать запись:

    127.0.0.1 — это циклический адрес, по которому хост обращается к самому себе, как к серверу имен. Файл /etc/resolv.conf может содержать и такие записи:

    В предыдущем примере в качестве параметра имя_домена было указано значение austin.century.com .

  • Выполните одно из следующих действий:
    • Запустите демон named с помощью программы SMIT: smit stnamed . Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Укажите, будете ли вы запускать программу named сейчас, при следующем запуске системы или в обоих случаях.
    • Внесите необходимые изменения в файл /etc/rc.tcpip . Удалите символ комментария в строке запуска демона named :

    Эта команда указывает, что демон должен инициализироваться при каждом запуске системы.

    Если вы не хотите инициализировать программу named с помощью SMIT, запустите ее для данного сеанса с помощью команды

    Для настройки хоста для работы с сервером имен воспользуйтесь Web-администратором системы ( wsm ) или выполните следующую процедуру.

    1. Создайте файл /etc/resolv.conf .
    2. Если данный хост будет использовать несколько серверов имен, добавьте их имена.
    3. Если сервер имен работает, то вы можете проверить соединение между ним и хостом с помощью команды:

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

    В таблице приведены другие задачи настройки.


    Задачи настройки хоста для применения сервера имен
    Процедура Команда быстрого доступа из SMIT Команда или имя файла Среда Web-администратора системы
    Создать файл /etc/resolv.conf smit stnamerslv2 create и edit /etc/resolv.conf 1
    Получить список всех серверов имен, используемых хостом smit lsnamerslv view /etc/resolv.conf Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную Файл hosts Содержимое файла /etc/hosts .
    Добавить сервер имен smit mknamerslv edit /etc/resolv.conf 2 Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную DNS . В поле IP-адрес сервера имен введите IP-адрес . Щелкните на Добавить OK .
    Удалить сервер имен smit rmnamerslv edit /etc/resolv.conf Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную DNS . Выберите сервер имен в поле Сервер имен для поиска . Щелкните на Удалить OK .
    Запустить/Перезапустить службу преобразования имен доменов smit stnamerslv Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную DNS . Отметьте переключатель Разрешить преобразование имен доменов с помощью DNS . Нажмите OK .
    Отменить применение службы преобразования имен доменов smit spnamerslv Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную DNS . Выключите переключатель Разрешить преобразование имен доменов с помощью DNS . Нажмите OK .
    Изменить/Показать домен smit mkdomain edit /etc/resolv.conf Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную DNS . Имя домена для поиска . Щелкните на Добавить OK .
    Удалить домен smit rmdomain edit /etc/resolv.conf Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную DNS . Выберите имя домена в Списке доменов для поиска . Щелкните на Удалить OK .

    Примечания:


      В первой строке файла /etc/resolv.conf задайте слово domain и полное имя домена, в котором находится данный хост. Например:

    В любой пустой строке ниже строки domain задайте слово nameserver , а затем через один или несколько пробелов укажите IP-адрес сервера имен, который будет использоваться данным хостом (сервер имен будет обслуживать домен, указанный в строке domain ). Можно перечислить до 16 серверов имен. Например, ваш файл /etc/resolv.conf может содержать следующие записи:

    Система будет обращаться к серверам имен в порядке их следования в списке.

    Команда named поддерживает динамическое обновление информации. Необходимо настроить файлы конфигурации и базы данных named таким образом, чтобы клиенты могли выполнять обновление. Область может быть задана как динамическая или как статическая. По умолчанию применяются статические области.

    Для создания динамической области нужно добавить ключевое слово allow-update в раздел области (zone) в файле /etc/named.conf . Ключевое слово allow-update определяет список IP-адресов хостов, которым разрешено обновление. Более подробная информация и примеры файла conf приведены в разделе named.conf File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference . В приведенном ниже примере обновлять динамическую область разрешено всем хостам:

    После того, как динамическая область описана, можно установить один из следующих трех режимов защиты области:

    Unsecured Всем разрешено в любой момент обновлять любую информацию в области.

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

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

    По умолчанию для динамических областей применяется незащищенный режим (unsecured). Для использования другого режима добавьте слово controlled или presecured после ключевого слова update-security в разделе области файла /etc/named.conf . Это слово сообщает серверу named , какой уровень защиты он должен использовать при работе с этой областью. Например:

    После выбора режима в соответствии с уровнем защиты необходимо изменить существующие файлы данных. В незащищенном режиме файлы данных используются «как есть». В управляемом или предварительно защищенном режиме необходимо создать набор пар ключей главного сервера/имени хоста для каждого имени в данной области. Это можно сделать с помощью команды nsupdate с параметром -g . Эта команда создает пару ключей (личный ключ и общий ключ). Эти ключи используются для создания идентификационных меток обновления. После создания всех ключей для списка имен областей, добавьте их в файл данных. Запись KEY имеет следующий формат:

    где:

    Индекс Определяет имя, используемое для обращения к данным в области.
    ttl Задает для этих данных время хранения в кэш-памяти (TTL). Это необязательное поле.
    Класс Определяет класс данных. Он зависит от области, но обычно имеет значение IN.
    Тип Задает тип записи. В данном случае запись имеет тип KEY.
    Флаги Задает для named информацию о ключе. 0x0000 определяет запись обычного ключа, использующегося для хоста. 0x0100 определяет запись ключа, связанную с именем области.
    Протокол Задает используемый протокол. В данный момент применяется только протокол 0 .
    Алгоритм Задает алгоритм ключа. В данный момент применяется только алгоритм 1 . Это способ идентификации MD5 с личным/общим ключом.
    Данные Задает ключ в формате base64. Команда nsupdate создает как общие, так и личные ключи в формате base64. Общий ключ указывается в конце файла вывода.

    Для того чтобы убедиться, что для имени хоста в динамической области установлена защита, необходимо добавить следующую строку в определение области, в которую входит данный хост:

    В этом примере для хоста bears определена запись KEY. Каждый, кто захочет обновить bears , должен будет пометить свое обновление личным ключом, совпадающим с общим ключом в базе данных. Для того чтобы команда nsupdate была успешно выполнена, необходимо разместить общий ключ в файле ключей клиента (по умолчанию, /etc/keyfile ). Он должен иметь следующий формат:

    Аналогичную запись KEY необходимо указать в разделе описания области. Ключ области должен быть указан и для режима presecured и для режима controlled. Если этого не сделать, то будет применяться незащищенный режим. Это можно сделать так же, как в примере с bears , но личный ключ должен быть оставлен администратору для использования его с командой nsupdate в административном режиме.

    Для создания пары ключей с помощью команды nsupdate введите:

    При этом создается ключ для области. Укажите последний ключ из пары в начале раздела описания области следующим образом:

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

    Протокол Lightweight Directory Access Protocol (LDAP) — это открытый стандартный протокол, регламентирующий способ получения и изменения информации в каталоге. Схема LDAP определяет правила заказа данных. Класс объектов ibm-HostTable , входящий в схему IBM SecureWay Directory, можно применять для хранения таблиц преобразования имен хостов в адреса.

    Класс объектов ibm-HostTable определен следующим образом:

    Определения атрибутов приведены ниже:

    Для настройки сервера LDAP в качестве хранилища таблицы хостов выполните следующие действия:

    1. Добавьте суффикс сервера LDAP. Суффикс — это начальная точка базы данных хостов. Например, «cn=hosts». Это можно сделать из браузера с помощью инструмента IBM SecureWay Directory Server Administration.
    2. Создайте файл в формате обмена данными LDAP (LDIF). Это можно сделать вручную или с помощью команды hosts2ldif , создающей файл LDIF из файла /etc/hosts . Более подробная информация приведена в разделе hosts2ldif Command книги AIX 5L Version 5.1 Commands Reference . Ниже приведен пример файла LDIF:

  • Импортируйте данные каталога их файла LDIF на сервер LDAP. Это можно сделать с помощью команды ldif2db или из браузера с помощью инструмента IBM SecureWay Directory Server Administration.
  • gethostbyname(), gethostbyaddr()

    Получают IP адрес хоста по имени или наоборот.

    Прототип

    struct hostent *gethostbyname(const char *name); // УСТАРЕЛО! struct hostent *gethostbyaddr(const char *addr, int len, int type);

    Описание

    Эти функции заменены на getaddrinfo()и

    getnameinfo()! В частности, gethostbyname()не очень хорошо работает с IPv6.

    Эти функции выполняют преобразование имён хостов в IP адреса и обратно. Например, если есть“ www. example. com”, можно использовать gethostbyname()чтобы получить IP адрес и сохранить его в struct in_addr.

    И наооборот, если у вас есть struct in_addr или struct in6_addr, можете воспользоваться gethostbyaddr()чтобы получить назад имя хоста. gethostbyaddr()совместима с IPv6, но пользоваться нужно getnameinfo()поновее и поярче.

    (Если у вас есть строка с IP адресом в формате цифр-и-точек для которой вы хотите узнать имя хоста, то вам лучше воспользоваться getaddrinfo()с флагом AI_CANONNAME.)

    gethostbyname()принимает строку вроде “www.guap.ru” и возвращает struct hostent, которая содержит тонны информации, включая IP адрес. (Другая информация это официальное имя хоста, список псевдонимов, тип адреса и список адресов. Это структура общего назначения и вы увидели как очень просто использовать её в наших особых целях.)

    gethostbyaddr()принимает struct in_addr или struct in6_addr и выдаёт соответствующее имя хоста (если оно есть), так что это функция, обратная gethostbyname(). Насчёт параметров, даже хотя addr меет тип char*, в действительности вам надо передавать указатель на struct in_addr. len должна быть sizeof(struct in_addr), и type должен быть AF_INET.

    Что это за struct hostent, которую нам возвращают? Она содержит множество полей, содержащих информацию о запрошенном хосте.

    char *h_name Настоящее каноническое имя хоста

    char **h_aliases Список псевдонимов, к нему можно обращаться, как к массиву, последний элемент содержит NULL

    int h_addrtype Тип адреса результата, в нашем случае должен быть AF_INET


    int length Длина адресов в байтах (4 для IPv4)

    char **h_addr_list Список IP адресов этого хоста. Хоть он и char**, в

    действительности это массив переодетых struct in_addr*.

    Последний элемент массива равен NULL.

    h_addr Псевдоним h_addr_list[0]. Если вам нужен любой старый IP адрес этого хоста (да, у них может быть несколько) используйте это поле.

    Возвращаемое значение

    Возвращает указатель на получившуюся struct hostent или NULL при ошибке.

    Вместо нормальной perror()и всего прилагающегося для выдачи сообщений об ошибке, эти функции пишут результат в переменную h_errno, которую можно распечатать функциями herror()или hstrerror(). Это подобно классической errno, perror(), и strerror().

    int main(int argc, char *argv[])

    struct hostent *he;

    struct in_addr **addr_list;

    fprintf(stderr,»usage: ghbn hostname\n»);

    // распечатать информацию об этом хосте:

    printf(«Official name is: %s\n», he->h_name);

    printf(» IP addresses: «);

    addr_list = (struct in_addr **)he->h_addr_list;

    for(i = 0; addr_list[i] != NULL; i++) <

    // взамен используйте getnameinfo()!

    struct hostent *he; struct in_addr ipv4addr;

    struct in6_addr ipv6addr;

    printf(«Host name: %s\n», he->h_name);

    Errno

    Содержит код ошибки последнего системного вызова.

    Прототип

    Описание

    Эта переменная содержит информацию об ошибках для множества системных вызовов. Если при вызове, например, socket()или listen()происходит ошибка, то возвращается -1 и в errno устанавливается код, позволяющий точно определить, что случилось.

    В заголовочном файле errno.h перечислены все символические имена ошибок, как EADDRINUSE, EPIPE, ECONNREFUSED и т.д.

    В большинстве систем errno определена потокобезопасным способом. (То есть, в действительности она не глобальная переменная, но ведёт себя так, как должна вести себя глобальная переменная в однопотоковой среде.)

    Возвращаемое значение

    Значение переменной это код последней произошедшей ошибки, но может означать

    “успех” если последнее действие завершилось удачно.

    Пример

    s = socket(PF_INET, SOCK_STREAM, 0); if (s == -1) <

    perror(«socket»); // или используйте strerror()

    if (select(n, &readfds, NULL, NULL) == -1) <

    // если мы просто прерваны, просто перезапуск вызовом select():

    if (errno == EINTR) goto tryagain; // AAAA! goto.

    // иначе это ошибка посерьёзней:

    Listen()

    Предписывает сокету слушать входящие подключения.

    Прототип

    int listen(int s, int backlog);

    Описание

    Параметр backlog означает резерв — сколько ожидающих соединений можете иметь до того, как ядро начнёт отбрасывать новые. Так что, как только придёт новое соединение, необходимо быстро принять (accept()) его, чтобы не переполнять резерв. Можно установить 10 или около того, и если при высокой нагрузке, ваши клиенты начнут получать “Connection refused” (“Соединение отвергнуто”), следует установить побольше.

    Перед вызовом listen()сервер должен вызвать bind()чтобы подключиться к определённому номеру порта. Клиенты будут подключаться к этому порту на IP адресе сервера.

    Возвращаемое значение

    Возвращает 0 при успехе или -1 в случае ошибки (errno устанавливается соответственно).

    Пример

    struct addrinfo hints, *res; int sockfd;

    // сначала заполняем адресные структуры с помощью getaddrinfo(): memset(&hints, 0, sizeof hints);

    hints.ai_family = AF_UNSPEC; // использовать либо IPv4 либо IPv6

    hints.ai_flags = AI_PASSIVE; // заполнить мой IP для меня getaddrinfo(NULL, «3490», &hints, &res);

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

    // связать с портом, переданным getaddrinfo(): bind(sockfd, res->ai_addr, res->ai_addrlen); listen(sockfd, 10);

    // где-то дальше есть цикл accept()

    Perror(), strerror()

    Распечатывают ошибку как читаемую строку

    Прототип

    #include // для strerror()

    Void perror(const char *s); char *strerror(int errnum);

    Описание

    Очень много функций при ошибке возвращают -1 и записывают в errno некоторое число, и было бы удобно, если бы можно было распечатать в понятной форме.

    И perror()это делает. Если необходимо добавить описание перед сообщением об ошибке, следует передать указатель на него в параметре s (можно оставить s как NULL и ничего дополнительно не напечатается.)

    Эта функция берёт значение errno, вроде ECONNRESET, и печатает его как “Connection reset by peer.”

    Функция strerror()подобна perror(), за исключением того, что она возвращает указатель на строку с сообщением об ошибке для заданного параметром errnum значения (обычно переменная передаётся в errno.)

    Возвращаемое значение

    strerror()возвращает указатель на строку с сообщением об ошибке.

    Пример

    s = socket(PF_INET, SOCK_STREAM, 0); if (s == -1) < // ошибка вышла

    // печатает «socket error: » + сообщение об ошибке:

    if (listen(s, 10) == -1) <

    // это печатает «an error: » + сообщение об ошибке из errno:

    printf(«an error: %s\n», strerror(errno));

    Recv(), recvfrom()

    Принимают данные из сокета.

    Прототип

    ssize_t recv(int s, void *buf, size_t len, int flags); ssize_t recvfrom(int s, void *buf, size_t len, int flags,

    struct sockaddr *from, socklen_t *fromlen);

    Описание


    Как только сокет создан и подключен, можно принимать из него данные вызовами recv()(для TCP SOCK_STREAM сокетов) и recvfrom()(для UDP SOCK_DGRAM сокетов).

    Обе функции принимают дескриптор сокета s, указатель на буфер buf, длину буфера в байтах len, и набор флагов flags, определяющих работу функций.

    Дополнительно, recvfrom()принимает struct sockaddr* from, указывающую откуда принимать данные и запишет в fromlen размер struct sockaddr. (Можно тоже инициализировать fromlen размером from или struct sockaddr.)

    Возвращаемое значение

    Возвращает число действительно принятых данных (что может быть меньше затребованного в параметре len), или -1 при ошибке (errno будет установлен соответственно.)

    Если удалённая сторона закрыла соединение, то recv()вернёт 0. Это нормальный способ определения того, что удаленная сторона закрыла соединение.

    Пример

    / потоковые сокеты и recv()

    struct addrinfo hints, *res; int sockfd;

    char buf[512]; int byte_count;

    // получить информацию хоста, создать сокет и подключиться memset(&hints, 0, sizeof hints);

    hints.ai_family = AF_UNSPEC; // использовать либо IPv4 либо IPv6 hints.ai_socktype = SOCK_STREAM; getaddrinfo(«www.example.com», «3490», &hints, &res);

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); connect(sockfd, res->ai_addr, res->ai_addrlen);

    // Прекрасно! Мы подключены и можем принимать данные! byte_count = recv(sockfd, buf, sizeof buf, 0);

    printf(«recv()’d %d bytes of data in buf\n», byte_count);

    //дейтаграммные сокеты и recvfrom()

    struct addrinfo hints, *res; int sockfd;

    int byte_count; socklen_t fromlen;

    struct sockaddr_storage addr; char buf[512];

    // получить информацию хоста, создать сокет и подключиться к порту 4950 memset(&hints, 0, sizeof hints);

    hints.ai_family = AF_UNSPEC; // использовать либо IPv4 либо IPv6 hints.ai_socktype = SOCK_DGRAM;

    hints.ai_flags = AI_PASSIVE; getaddrinfo(NULL, «4950», &hints, &res);

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); bind(sockfd, res->ai_addr, res->ai_addrlen);

    // accept() не нужен, только recvfrom(): fromlen = sizeof addr;

    byte_count = recvfrom(sockfd, buf, sizeof buf, 0, &addr, &fromlen);

    printf(«recv()’d %d bytes of data in buf\n», byte_count); printf(«from IP address %s\n»,

    ((struct sockadd_in *)&addr)->sin_addr:

    ((struct sockadd_in6 *)&addr)->sin6_addr,

    ipstr, sizeof ipstr);

    Select()

    Проверяет готовы ли дескрипторы сокетов к чтению — записи.

    Прототип

    int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,

    struct timeval *timeout);

    FD_SET(int fd, fd_set *set); FD_CLR(int fd, fd_set *set); FD_ISSET(int

    fd,fd_set*set); FD_ZERO(fd_set *set);

    Описание

    Функция select()предоставляет способ одновременной проверки множества сокетов на предмет ожидания recv(), готовности к передаче данных через send()без блокирования или возникновения исключения.

    После того как макросы вроде FD_SET()использованымассива структур можно передать его функции как один из следующих параметров: readfds если хотите знать, готов ли какой-нибудь сокет из массива к recv(), writefds если какой-либо сокет готов к send(), и/или exceptfds если если нужно узнать произошло ли на каком-нибудь исключение в сокете. Любой их этих параметров может быть NULL если этот тип событий неинтересен. После возврата из select()значения в массиве будут изменены, чтобы показать, какие сокеты готовы к чтению — записи и какие имеют исключения.

    Первый параметр, n это наивысший номер дескриптора сокета (они просто int) плюс один.

    Напоследок, struct timeval *timeout в конце позволяет указать select()как долго проверять эти массивы. Она вернёт управление при истечении таймаута или при возникновении события, смотря что раньше. В struct timeval есть два поля: tv_sec это количество секунд, к которому добавляется tv_usec, количество микросекунд

    (1 000 000 микросекунд в секунде.) Вспомогательные макросы делают следующее:

    FD_SET(int fd, fd_set *set); FD_CLR(int fd, fd_set *set); FD_ISSET(int fd, fd_set *set); FD_ZERO(fd_set *set);
    Добавляет fd в set. Удаляет fd из set. Возвращает true если fd есть в set. Очищает set.

    Возвращаемое значение

    Возвращает количество дескрипторов с событиями в массиве, 0 если таймаут истёк и -1 при ошибке (errno устанавливается соответственно.) Кроме того, массивы изменяются чтобы показать готовые сокеты.

    Пример

    t s1, s2, n; fd_set readfds; struct timeval tv;

    char buf1[256], buf2[256];

    // полагаем, что здесь оба подключены к серверу

    // заранее очищаем массив FD_ZERO(&readfds);

    // добавляем наши дескрипторы в массив FD_SET(s1, &readfds);

    // поскольку s2 создан вторым, он “больше” и его используем

    // в параметре n в select() n = s2 + 1;

    // ждём появления данных на каком-либо сокете (таймаут 10.5 секунд) tv.tv_sec = 10;

    perror(«select»); // в select() произошла ошибка

    printf(«Timeout occurred! No data after 10.5 seconds.\n»);

    // на одном или обоих дескрипторах есть данные

    if (FD_ISSET(s1, &readfds)) <

    recv(s1, buf1, sizeof buf1, 0);

    if (FD_ISSET(s2, &readfds)) <

    recv(s1, buf2, sizeof buf2, 0);

    Socket()

    Создаёт дескриптор сокета

    Прототип

    int socket(int domain, int type, int protocol);

    Описание

    Возвращает дескриптор сокета, который можно использовать. Обычно это первый шаг в процессе написания программ с сокетами и результат можно использовать в последующих вызовах listen(), bind(), accept()или множества других функций.

    Обычно значения параметров получается из вызова getaddrinfo(), как в примере ниже, но можно их заполнять и вручную.

    domain определяет тип нужного вам сокета. Их может быть

    множество, но поскольку это руководство по сокетам tcp/ip, он будет PF_INET

    для IPv4 и PF_INET6 для IPv6.

    type Хотя параметр type может принимать множество значений, его следует установить в SOCK_STREAM для надёжных TCP сокетов (send(), recv()) либо SOCK_DGRAM для ненадёжных быстрых UDP сокетов (sendto(), recvfrom().)

    protocol Параметр protocol указывает какой протокол использовать для этого типа сокетов, например, SOCK_STREAM использует TCP. Если будет использоваться SOCK_STREAM или SOCK_DGRAM, можно просто установить protocol в 0, и он автоматически использует правильный протокол. Иначе можно использовать getprotobyname()для выбора номера нужного протокола.

    Возвращаемое значение

    Дескриптор нового сокета для последующих вызовов или -1 при ошибке (и errno

    будет установлен соответственно.)

    Пример

    sruct addrinfo hints, *res; int sockfd;

    // сначала заполняем адресные структуры с помощью getaddrinfo(): memset(&hints, 0, sizeof hints);

    hints.ai_family = AF_UNSPEC; // AF_INET, AF_INET6, или AF_UNSPEC


    hints.ai_socktype = SOCK_STREAM; // SOCK_STREAM или SOCK_DGRAM getaddrinfo(«www.example.com», «3490», &hints, &res);

    // создаём сокет с помощью информации, которую наскребла getaddrinfo(): sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

    13. setsockopt(), getsockopt()

    Устанавливает для сокета различные опции.

    Прототип

    int getsockopt(int s, int level, int optname, void *optval,

    int setsockopt(int s, int level, int optname, const void *optval,

    Описание

    Эти функции получают и устанавливают определённые опции сокета.

    Параметры это s это сокет, level должен быть установлен в SOL_SOCKET. Затем, в optname установается имя которое связывает сокет с символическим именем устройства вроде eth0 вместо использования bind()для привязки к IP адресу. Позволяет другим сокетам связываться (bind()) с этим портом, несмотря на то, что уже существует активный сокет, слушающий этот порт. Это позволяет обойти сообщения “Address already in use”, когда вы пытаетесь перезапустить ваш сервер после обрушения. Позволяет UDP дейтаграммным (SOCK_DGRAM) сокетам посылать пакеты по широковещательным адресам и принимать и с них. Насчёт параметра optval, обычно это указатель на int, показывающую значение запроса.

    Последний параметр, optlen, заполняется getsockopt()если необходимо указать его для setsockopt(), возможно он будет sizeof(int).

    Возвращаемое значение

    Возвращает 0 при успехе или -1 в случае ошибки (errno устанавливается соответственно).

    Пример

    int optval; int optlen;

    // установить SO_REUSEADDR на сокете в ИСТИННО (1): optval = 1;

    setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);

    // связать сокет с именем устройства (может не работать на некоторых системах): optval2 = «eth1»; // 4 байта длины, итого 4,ниже:

    setsockopt(s2, SOL_SOCKET, SO_BINDTODEVICE, optval2, 4);

    // посмотреть установлен ли флаг SO_BROADCAST: getsockopt(s3, SOL_SOCKET, SO_BROADCAST, &optval, &optlen); if (optval != 0) <

    print(«SO_BROADCAST enabled on s3!\n»);

    Send(), sendto()

    Посылают данные через сокет.

    Прототип

    ssize_t send(int s, const void *buf, size_t len, int flags); ssize_t sendto(int s, const void *buf, size_t len,

    int flags, const struct sockaddr *to, socklen_t tolen);

    Описание

    Эти функции посылают данные в сокет. В общем случае send()используется для TCP SOCK_STREAM п о д к л ю ч ё н н ы х с о к е т о в , а sendto()д л я U D P SOCK_DGRAM неподключённых дейтаграммных сокетов. Каждый раз посылая пакет по неподключённому сокету вы должны указывать место назначения, поэтому последние параметры sendto()задают куда пакет направляется.

    В обоих, send()и sendto(), параметр s это сокет, buf указатель на данные, которые необходимо послать, len число посылаемых байт и flags позволяет определить дополнительную информацию как посылать данные. Установите flags в ноль, если хотите иметь “нормальные” данные. Ниже приведены несколько наиболее часто используемых флагов:

    MSG_OOB Посылает “out of band” данные. TCP поддерживает этот способ

    Сообщить принимающей стороне, что у этих данных приоритет выше, чем у нормальных. Приёмник получит сигнал SIGURG и примет эти данные без предварительной выборки нормальных данных из очереди.

    MSG_DONTROUTE Не посылать эти данные через маршрутизатор, они местные.

    MSG_DONTWAIT Если send()должна блокироваться из-за загруженности внешнего трафика, она вернёт EAGAIN. Это вроде “Разрешить не блокирование для этой посылки”

    MSG_NOSIGNAL send()на удалённый хост, который больше не принимает (recv()) данные, обычно возбуждает сигнал SIGPIPE. Этот флаг предотвращает возбуждение такого сигнала.

    Возвращаемое значение

    Возвращает число действительно посланных байт или -1 при ошибке (errno устанавливается соответственно.) Заметьте, что это число может быть меньше затребованного. Вспомогательная функция в разделе по send()поможет обойти это.

    Также, если сокет был закрыт на противной стороне, процесс, вызвавший send(), получит сигнал SIGPIPE. (Если только send()не был вызван с флагом MSG_NOSIGNAL.)

    Пример

    int spatula_count = 3490;

    char *secret_message = «The Cheese is in The Toaster”;

    int stream_socket, dgram_socket; struct sockaddr_in dest;

    // сначала с потоковым сокетом TCP:

    // полагаем, что сокеты созданы и подключены

    // преобразовать в порядок байтов сети temp = htonl(spatula_count);

    // послать данные нормально: send(stream_socket, &temp, sizeof temp, 0);

    // послать секретное out of band сообщение:

    send(stream_socket, secret_message, strlen(secret_message)+1, MSG_OOB);

    // теперь с дейтаграммным сокетом UDP:

    //dest = . // полагаем, что «dest» содержит адрес назначения

    // послать секретное послание нормально:

    sendto(dgram_socket, secret_message, strlen(secret_message)+1, 0,

    Останавливает обмен по сокету.

    Прототип

    int shutdown(int s, int how);

    Описание

    close()) закрывает обе стороны, для чтения и для записи, а дескриптор освобождается. Если необходимо закрыть только одну или другую сторону, следует использовать shutdown().

    Параметр s это сокет с которым вы работаете, а что с ним делать определяет параметр how. Это может быть SHUT_RD для предотвращения дальнейших recv(), SHUT_WR для запрещения дальнейших send(), или SHUT_RDWR для обоих.

    shutdown()не освобождает дескриптор сокета и в итоге прийдется вызвать close()чтобы закрыть его полностью.

    Этот системный вызов используется редко.

    Возвращаемое значение

    Возвращает 0 при успехе или -1 в случае ошибки (errno устанавливается соответственно).

    Пример

    nt s = socket(PF_INET, SOCK_STREAM, 0);

    // …посылаем и обрабатываем здесь…

    // и когда всё сделано запрещаем дальнейшие посылки: shutdown(s,

    15. struct sockaddr

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

    Прототип

    // Все указатели на адресные структуры сокетов часто приводятся

    // к этому типу перед их использованием в различных функциях и вызовах:

    unsigned short sa_family; // семейство адресов, AF_xxx char sa_data[14]; // 14 байт адреса протокола

    // IPv4 AF_INET сокеты: struct sockaddr_in <

    short sin_family; // например, AF_INET, AF_INET6

    unsigned short sin_port; // например, htons(3490)

    struct in_addr sin_addr; // смотри struct in_addr, ниже

    char sin_zero[8] // обнулите, если хочется

    unsigned long s_addr; // заполнить с помощью inet_pton()

    // IPv6 AF_INET6 сокеты: struct sockaddr_in6 <

    u_int16_t sin6_family; // семейство адресов, AF_INET6 u_int16_t sin6_port; // номер порта, Порядок Байтов Сети u_int32_t sin6_flowinfo; // IPv6 flow information

    struct in6_addr sin6_addr; // IPv6 адрес u_int32_t sin6_scope_id; // Scope ID

    unsigned char s6_addr[16]; // заполнить с помощью inet_pton()

    // Общая структура хранения адреса сокета достаточно велика для хранения

    // данных struct sockaddr_in или struct sockaddr_in6:

    sa_family_t ss_family; // семейство адресов

    // всё это расширение зависит от реализации, проигнорируйте:

    Описание

    Это базовые структуры для всех системных вызовов и функций, работающих с интернет адресами. Для заполнения этих структур часто используется getaddinfo()а затем, по мере надобности читать их.

    В памяти struct sockaddr_in и struct sockaddr_in6 начинаются с одинаковой struct sockaddr, и можно приводить один тип к другому без какого- либо ущерба.

    Структура struct sockaddr_in используется с IPv4 адресами (вроде “192.0.2.10”).

    Она содержит семейство адресов (AF_INET), порт в sin_port и IPv4 адрес в sin_addr.

    Кроме того в struct sockaddr_in есть поле sin_zero , которое должно содержать нули. Это можно сделать с помощью функцией memset().

    В struct in_addr чаще всего используется только поле s_addr, поскольку многие системы реализуют только его. struct sockadd_in6 очень похожа на struct in6_addr , но используется для IPv6. struct sockaddr_storage передаётся в accept()или recvfrom()когда необходимо написать код, не зависящий от версии IP, и неизвестно каким будет новый адрес — IPv4 или IPv6. Структура struct sockaddr_storage достаточно велика, чтобы содержать оба типа, в отличие от оригинальной маленькой struct sockaddr.

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