inet_aton, inet_addr, inet_network, inet_ntoa, inet_makeaddr, inet_lnaof,
inet_netof - функции
для работы
с адресами
Интернет
Standard C library (
libc,
-lc)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
[[deprecated]] char *inet_ntoa(struct in_addr in);
struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host);
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);
inet_aton(),
inet_ntoa():
начиная с glibc 2.19:
_DEFAULT_SOURCE
в glibc до версии 2.19 включительно:
_BSD_SOURCE || _BSD_SOURCE
inet_aton()
преобразует
адрес
Интернет-узла
cp из
числовой
формы
записи IPv4 с
точками (IPv4
numbers-and-dots) в
двоичную
форму (с
сетевым
порядком
байт) и
сохраняет
её в
структуре,
на которую
ссылается
inp.
inet_aton()
возвращает
ненулевое
значение,
если адрес
правильный,
и ноль, если
нет. Адрес,
указанный
в
cp, может
принимать
одну из
следующих
форм:
- a.b.c.d
- Каждая
из четырёх
групп
чисел
представляет
байт
адреса;
байты
назначаются
слева
направо.
- a.b.c
- Части a и
b задают
первые два
байта
двоичного
адреса.
Часть c
расценивается
как
16-разрядное
значение,
определяющее
два самых
правых
байта
двоичного
адреса.
Такая
запись
совместима
c сетевыми
адресами
(устаревшими)
класса B.
- a.b
- Часть a
определяет
первый
байт
двоичного
адреса.
Часть b
расценивается
как
24-разрядное
значение,
определяющее
три самых
правых
байта
двоичного
адреса.
Данная
форма
записи
совместима
с сетевыми
адресами
(устаревшими)
класса A.
- a
- Значение
a
расценивается
как
32-разрядное
значение,
которое
хранится в
двоичном
формате
без какой
либо
перегруппировки
байтов.
Во всех
вышеперечисленные
формах
записи
адресов
числа
могут быть
указаны в
десятичной,
восьмеричной
(с
префиксом
0) или
шестнадцатеричной
(с
префиксом
0X) системе
счисления.
Адреса,
записанные
в любой из
этих форм,
называются
числовой
формой
записи IPv4 с
точками.
Форма
записи, в
которой
используются
только
четыре
десятичных
числа,
называется
десятично-точечной
записью IPv4 (
IPv4
dotted-decimal notation) или
иногда
IPv4 dotted-quad
notation.
Функция
inet_aton()
возвращает
1, если
переданная
строка
была
обработана
успешно,
или 0, если
строка
имеет
некорректные
данные (в
errno
ошибка
не
записывается).
Функция
inet_addr()
преобразует
адрес
Интернет-узла
cp из
числовой
формы
записи IPv4 с
точками в
двоичную
форму с
сетевым
порядком
байт. Если
адрес,
подаваемый
на вход,
неверный,
функция
возвращает
INADDR_NONE (обычно -1).
Использование
этой
функции
проблематично,
т.к.
значение -1
эквивалентно
корректному
адресу (255.255.255.255).
Избегайте
использования
этой
функции,
вместо нее
используйте
inet_aton(),
inet_pton(3) или
getaddrinfo(3),
которые
предоставляют
более
правильный
способ
указания
на ошибку.
Функция
inet_network()
преобразует
строку
cp,
записанную
в числовой
форме
записи IPv4 с
точками, в
число
(порядок
байт узла),
пригодное
для
использования
в качестве
сетевого
адреса
интернета.
В случае
успешного
выполнения
возвращается
преобразованный
адрес. В
случае
указания
некорректной
строки,
возвращается
-1.
Функция
inet_ntoa()
преобразует
адрес
Интернет-узла
in,
заданного
в сетевом
порядке
байтов, в
строку в
числовой
форме
записи IPv4 с
точками.
Строка
возвращается
в
статически
выделяемом
буфере,
который
перезаписывается
при
последующих
вызовах.
Функция
inet_lnaof()
возвращает
номер узла
из
интернет-адреса
in.
Возвращаемое
значение
имеет
порядок
байт узла.
Функция
inet_netof()
возвращает
номер сети
из
интернет-адреса
in.
Возвращаемое
значение
имеет
порядок
байт узла.
Функция
inet_makeaddr()
противоположна
inet_netof() и
inet_lnaof(). Она
возвращает
адрес
Интернет-узла
в сетевом
порядке
байт,
создавая
его путём
объединения
номера
сети
net с
номером
узла
host (оба
задаются в
порядке
байт узла).
The structure
in_addr as used in
inet_ntoa(),
inet_makeaddr(),
inet_lnaof(), and
inet_netof() is
defined in
<netinet/in.h> as:
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
inet_aton(), inet_addr(), inet_network(),
inet_ntoa() |
Безвредность
в нитях |
MT-Safe locale |
inet_makeaddr(), inet_lnaof(), inet_netof() |
Безвредность
в нитях |
MT-Safe |
inet_addr(),
inet_ntoa(): POSIX.1-2001, POSIX.1-2008, 4.3BSD.
Функция
inet_aton()
не
определена
в POSIX.1, однако
доступна в
большинстве
систем.
В
архитектурах
x86 порядок
байтов
узла таков,
что
младший
байт
является
первым (little endian =
от
младшего к
старшему), а
в сетевом
порядке
байт,
который
используется
в интернет,
старший
байт
является
первым (big endian =
от
старшего к
младшему).
inet_lnaof(),
inet_netof() и
inet_makeaddr()
является
устаревшими
функциями,
которые
предполагают,
что
используется
классовая
сетевая
адресация.
При
классовой
адресации
сетевой
адрес IPv4
разделяется
на узловой
и сетевой
компоненты
по
байтовой
границе
следующим
образом:
- Класс A
- На
данный тип
адреса
указывает 0
на месте
старшего
бита
(сетевой
порядок
байтов)
адреса.
Сетевой
адрес
содержится
в самом
старшем
байте, а
адреса
узлов
занимают
оставшиеся
три байта.
- Класс B
- На
данный тип
адреса
указывает
двоичное
значение 10
на месте
двух самых
старших
битов
(сетевой
порядок
байтов)
адреса.
Сетевой
адрес
содержится
в двух
старших
байтах, а
адреса
узлов
занимают
оставшиеся
два байта.
- Класс C
- На
данный тип
адреса
указывает
двоичное
значение 110
на месте
самых трех
старших
битов
(сетевой
порядок
байтов)
адреса.
Сетевой
адрес
содержится
в первых
трёх
старших
байтах, а
адреса
узлов
занимают
оставшийся
байт.
Классовая
адресация
в
настоящее
время
устарела и
была
заменена
на
бесклассовую
адресацию
(CIDR), при
которой
компоненты
сети и узла
в адресе
могут
занимать
произвольное
число
битов (а не
байтов).
Ниже
приведён
код
примера
использования
inet_aton() и
inet_ntoa().
Рассмотрим
результат
работы
примера:
$ ./a.out 226.000.000.037 # Последний байт в восьмеричной сс
226.0.0.31
$ ./a.out 0x7f.1 # Первый байт в шестнадцатеричной сс
127.0.0.1
#define _DEFAULT_SOURCE
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
struct in_addr addr;
if (argc != 2) {
fprintf(stderr, "%s <dotted-address>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (inet_aton(argv[1], &addr) == 0) {
fprintf(stderr, "Invalid address\n");
exit(EXIT_FAILURE);
}
printf("%s\n", inet_ntoa(addr));
exit(EXIT_SUCCESS);
}
byteorder(3),
getaddrinfo(3),
gethostbyname(3),
getnameinfo(3),
getnetent(3),
inet_net_pton(3),
inet_ntop(3),
inet_pton(3),
hosts(5),
networks(5)
Русский
перевод
этой
страницы
руководства
был сделан
Azamat Hackimov <
[email protected]>, Dmitriy S. Seregin
<
[email protected]>, Yuri Kozlov <
[email protected]> и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]