Преобразовать текстовый адрес хоста в численный адрес
#include <sys/socket.h>#include <arpa/inet.h>int inet_pton( int af,const char *src,void *dst );
libc
Функция inet_pton() преобразует текстовое представление сетевого адреса (src) в числовое (dst).
Преобразованный адрес сохраняется в сетевом порядке байт в dst. Буфер dst должен быть достаточным по размеру для сохранения адреса:
Семейство адресов | Размер числового адреса |
---|---|
AF_INET | 4 байта |
AF_INET6 | 16 байт |
AF_INET адреса
IPv4 адреса должны быть записаны в стандартном десятичном формате с точками:
ddd.ddd.ddd.ddd
где ddd – десятичное число в диапазоне от 0
до 255
.
Многие существующие реализации функций inet_addr() и inet_aton() могут принимать нестандартный ввод адреса: восьмиричные, шестнадцатиричные числа, а также адреса, в которых меньше четырёх чисел. Функция inet_pton() не принимает данные форматы записи. |
AF_INET6 адреса
IPv6 адреса должны быть указаны в одном из следующих стандартных форматов:
x:x:x:x:x:x:x:x
где x – одно из восьми шестнадцатиричных значений с максимальным размером 16 бит. Например:
DEAD:BEEF:7654:3210:FEDC:3210:7654:BA98
417A:200C:800:8:0:0:0:1080
1080:0:0:0:8:800:200C:417A
FF01:0:0:0:0:0:0:43
0:0:0:0:0:0:0:1
0:0:0:0:0:0:0:0
могут быть представлены в следующем виде:
1080::8:800:200C:417A
FF01::43
::1
::
Удобным форматом записи адреса при работе со смешанной IPv4-IPv6 средой является:
x:x:x:x:x:x:d.d.d.d
где x – одно из шести первых шестнадцатиричных значений (с максимальным размером 16 бит), а d – десятичное число в пределах от 0
до 255
для последних четырёх значений (стандартное представление адреса AF_INET
семейства). Например:
0:0:0:0:0:0:13.1.68.3
0:0:0:0:0:FFFF:129.144.52.38
Короткая форма записи:
::13.1.68.3
::FFFF:129.144.52.38
#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <arpa/inet.h>#include <errno.h>#define INADDR "10.1.0.29"#define IN6ADDR "DEAD:BEEF:7654:3210:FEDC:3210:7654:BA98"int main(){struct in_addr inaddr;struct in6_addr in6addr;char buf[INET_ADDRSTRLEN], buf6[INET6_ADDRSTRLEN];int rval;if ( (rval = inet_pton( AF_INET, INADDR, &inaddr )) == 0 ){printf( "Invalid address: %s\n", INADDR );exit( EXIT_FAILURE );} elseif ( rval == -1 ){perror( "inet_pton" );exit( EXIT_FAILURE );}if ( inet_ntop( AF_INET, &inaddr, buf, sizeof( buf ) ) != NULL )printf( "inet addr: %s\n", buf );else {perror( "inet_ntop" );exit( EXIT_FAILURE );}if ( (rval = inet_pton( AF_INET6, IN6ADDR, &in6addr )) == 0 ){printf( "Invalid address: %s\n", IN6ADDR );exit( EXIT_FAILURE );} elseif ( rval == -1 ){perror( "inet_pton" );exit( EXIT_FAILURE );}if ( inet_ntop( AF_INET6, &in6addr, buf6, sizeof( buf6 ) ) != NULL )printf( "inet6 addr: %s\n", buf6 );else {perror( "inet_ntop" );exit( EXIT_FAILURE );}return (EXIT_SUCCESS);}
POSIX 1003.1
Основано на: RFC 2373
Предыдущий раздел: Описание API системной библиотеки