inet_pton(3) | Library Functions Manual | inet_pton(3) |
inet_pton - преобразует адреса IPv4 и IPv6 из текстового вида в двоичный формат
Standard C library (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 записывается в сетевом порядке байт.
В настоящее время поддерживаются следующие семейства адресов:
При успешном выполнении функция inet_pton() возвращает 1 (адрес преобразован). Функция возвращает 0, если src не содержит строку символов, представляющую правильный сетевой адрес для указанного семейства адресов. Если af не содержит допустимого значения семейства адресов, то возвращается -1 и errno присваивается значение EAFNOSUPPORT.
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
inet_pton() | Безвредность в нитях | MT-Safe locale |
POSIX.1-2001, POSIX.1-2008.
В отличие от 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).
При 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> 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,
"Использование: %s {i4|i6|<число>} строка\n", argv[0]);
exit(EXIT_FAILURE);
}
domain = (strcmp(argv[1], "i4") == 0) ? AF_INET :
(strcmp(argv[1], "i6") == 0) ? AF_INET6 : atoi(argv[1]);
s = inet_pton(domain, argv[2], buf);
if (s <= 0) {
if (s == 0)
fprintf(stderr, "Неверный формат представления");
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); }
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
5 февраля 2023 г. | Linux man-pages 6.03 |