inet_pton(3)

НАИМЕНОВАНИЕ
inet_pton - преобразует адреса IPv4 и IPv6 из текстового вида в двоичный формат

БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)

СИНТАКСИС
#include <arpa/inet.h>

int inet_pton(int af, const char *restrict src, void *restrict dst);

ОПИСАНИЕ
Данная функция преобразует строку символов src в структуру сетевого адреса сетевого семейства адресов af, а затем копирует полученную структуру по адресу dst. Значение аргумента af должно быть равно AF_INET или AF_INET6. Значение dst записывается в сетевом порядке байт.

В настоящее время поддерживаются следующие семейства адресов:

AF_INET
    src points to a character string containing an IPv4 network address in dotted-decimal format, "ddd.ddd.ddd.ddd", where ddd is a decimal number of up to three digits in the range 0 to 255. The address is converted to a struct in_addr and copied to dst, which must be sizeof(struct in_addr) (4) bytes (32 bits) long.

AF_INET6
    Значение src указывает на строку символов, содержащую сетевой адрес IPv6. Адрес преобразуется в struct in6_addr и копируется в dst, размер которой должен быть равен sizeof(struct in6_addr) (16) байтам (128 бит). Допустимые форматы адресов IPv6:

    •   Предпочтительный формат — x:x:x:x:x:x:x:x. Он состоит из восьми шестнадцатеричных чисел, каждое из которых представляет 16-битное значение (т. е., каждый x может содержать до 4 шестнадцатеричных цифр).

    •   Серия непрерывных нулевых значений в предпочтительном формате может сокращённо записываться как ::. В адресе допускается только одно появление ::. Например, адрес интерфейса обратной петли 0:0:0:0:0:0:0:1 может быть сокращён до ::1. Шаблонный адрес, состоящий из всех нулей, может быть записан как ::.

    •   Альтернативный формат — полезен для записи IPv4-отображённых адресов IPv6. Этот формат имеет вид x:x:x:x:x:x:d.d.d.d, где шесть начальных x представляют собой шестнадцатеричные значения, которые определяют шесть наиболее значимых 16-битных частей адреса (т. е., 96 бит), а символами d выражается значение в точечно-десятичном формате, которое определяет наименее значимые 32 бита адреса. Пример адреса: ::FFFF:204.152.189.116.

    Дополнительную информацию о представлении адресов IPv6 смотрите в RFC 2373.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функция inet_pton() возвращает 1 (адрес преобразован). Функция возвращает 0, если src не содержит строку символов, представляющую правильный сетевой адрес для указанного семейства адресов. Если af не содержит допустимого значения семейства адресов, то возвращается -1 и errno присваивается значение EAFNOSUPPORT.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
inet_pton() | Безвредность в нитях | MT-Safe locale

ВЕРСИИ
В отличие от inet_aton(3) и inet_addr(3), inet_pton() поддерживает адреса IPv6. Но стоит отметить, что inet_pton() работает только с адресами IPv4 в точечно-десятичном формате, в то время как inet_aton(3) и inet_addr(3) поддерживают более распространённый формат чисел-с-точками (numbers-and-dots notation) (шестнадцатеричный и восьмеричный формат чисел, и форматы, которые не требуют явного указания всех четырёх байт). Программный интерфейс, который понимает одновременно адреса и IPv6, и IPv4 в формате чисел-с-точками, смотрите getaddrinfo(3).

СТАНДАРТЫ
POSIX.1-2008.

ИСТОРИЯ
POSIX.1-2001.

ОШИБКИ
При AF_INET6 не распознаются адреса IPv4. В этом случае в src должен указываться IPv4-отображённый адрес IPv6.

ПРИМЕРЫ
Представленная ниже программа показывает использование inet_pton() и inet_ntop(3). Пример работы программы:

    $ ./a.out i6 0:0:0:0:0:0:0:0
    ::
    $ ./a.out i6 1:0:0:0:0:0:0:8
    1::8
    $ ./a.out i6 0:0:0:0:0:FFFF:204.152.189.116
    ::ffff:204.152.189.116

  Исходный код программы
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define streq(...)  (strcmp(__VA_ARGS__) == 0)

    int
    main(int argc, char *argv[])
    {
        unsigned char buf[sizeof(struct in6_addr)];
        int domain, s;
        char str[INET6_ADDRSTRLEN];

        if (argc != 3) {
            fprintf(stderr, "Usage: %s {i4|i6|<num>} string\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        domain = streq(argv[1], "i4") ? AF_INET :
                 streq(argv[1], "i6") ? AF_INET6 : atoi(argv[1]);

        s = inet_pton(domain, argv[2], buf);
        if (s <= 0) {
            if (s == 0)
                fprintf(stderr, "Not in presentation format");
            else
                perror("inet_pton");
            exit(EXIT_FAILURE);
        }

        if (inet_ntop(domain, buf, str, INET6_ADDRSTRLEN) == NULL) {
            perror("inet_ntop");
            exit(EXIT_FAILURE);
        }

        printf("%s\n", str);

        exit(EXIT_SUCCESS);
    }

СМОТРИТЕ ТАКЖЕ
getaddrinfo(3), inet(3), inet_ntop(3)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (debian-l10n-russian@lists.debian.org).