기능 요약 (Summary)
inet_pton( ) 함수는 사람이 알아보기 쉬운 텍스트(human-readable text)형태의 IPv4 와 IPv6 주소를 binary 형태로 변환 하는 기능을 한다.
헤더 (Header files)
이 함수를 사용하려면 다음 헤더파일을 포함시킨다.
#include <arpa/inet.h>
API 원형 (API Prototype)
int inet_pton(int af, const char *src, void *dst);
af [input] - address family를 지정한다. src의 문자열이 IPv4 주소를 나타내는지, IPv6 주소를 나타내는지를 함수에 알린다.
src [input] - 문자열 형태의 IP주소를 넣는다.
dst : [output] - src를 binary형태로 변환 후 복사된 메모리의 포인터이다.
설명 (Description)
이 함수는 af의 address family가 가리키는 네트워크 주소 구조체에 src의 문자열 값을 변환 한 후, 이 네트워크 주소 구조체를 dst에 복사한다.
af는 반드시 AF_INET 혹은 AF_INET6 둘 중 하나여야 한다.
dst는 network byte order로 작성된다.
언급했듯이 현재는 IPv4 및 IPv6를 의미하는 아래 2개의 address family들만 지원된다.
AF_INET
src이 가리키는 문자열은 IPv4 네트워크 주소이고, 점으로 자리를 구분하는 10진수 주소 형태이다.
"ddd.ddd.ddd.ddd" 와 같은 형태이고, ddd 자리에 0~255 범위의 10진수가 온다.
그 주소는 in_addr 구조체로 변환 된 후, 4byte크기를 가지는 dst로 복사된다.
참고로 in_addr 구조체는 크기가 4byte 이다.
AF_INET6
src이 가리키는 문자열은 IPv6 네트워크 주소이다.
그 주소는 in6_addr 구조체로 변환된 후 16byte크기를 가지는 dst로 복사된다.
src에 넣을 수 있는 IPv6 주소 표현방식은 IPv4 주소 표현 방식에 비해 다양한데, 아래와 같은 규칙을 따른다.
IPv6 주소 표현 규칙
1. 우선시 되는 형태는 x:x:x:x:x:x:x:x 이다.
각각의 x 는 16진수 문자이며 16bit 값을 표현하므로, 최대 4자리가 될 수 있다.
또한 x와 x 는 콜론으로 구분되며, 전체 8개로 구성된다.
2. 연속되는 0 값들은 :: 로 축약해서 표현하는 방법이 사용된다.
단, 하나의 주소표현에서 :: 는 단 한번만 등장할 수 있다.
예를 들면, IPv6의 loopback 주소는 0:0:0:0:0:0:0:1 인데, 이걸 간단히 ::1 로 축약해서 표현 할 수 있다.
또한, wildcard 주소인 모든 값이 0으로 구성된 주소는, :: 라고 쓸 수 있다.
3. 대체 유형은 IPv4-mapped IPv6주소를 표현하는데 유용하다. 이 형태는 x:x:x:x:x:x:d.d.d.d 와 같이 쓰인다.
처음 앞의 6개 x 들은 주소의 최상위 비트 6개를 정의한다. (96 bit)
그리고 나머지 d들은 최하위 32bit에 점으로 구분하는 10진수 표기법을 정의한다.
예를 들면 ::FFFF:204.152.189.116 이러한 주소다.
더 자세한 IPv6 주소 표현방법을 알고 싶다면, RFC 2373 을 참고하기 바란다.
반환값 (Return value)
inet_pton( )은 성공시 1을 반환한다.
즉, 1이 return되면 네트워크 주소가 성공적으로 변환되었음을 의미한다.
0 이 반환되는 경우는 src의 문자열이 나타내는 네트워크 주소가, af에 명시된 address family의 유효한 값이 아닌 경우이다.
-1 이 반환되는 경우는 af가 적절한 address family값이 아닌 경우이다. 이때는 errno이 EAFNOSUPPORT 값으로 설정된다.
준수사항
POSIX.1-2001, POSIX.1-2008.
알아둘 내용
inet_aton( ) 및 inet_addr( )와는 달리, inet_pton( )은 IPv6주소를 지원한다.
반면에, inet_pton( )은 점 3개와 10진수 표현법의 (dotted-decimal notation) IPv4주소만 받아들인다.
inet_aton( )및 inet_addr( )은 좀더 일반적인 표현법인 'numbers-and-dots notation' 에 대해서도 받아들인다.
'numbers-and-dots notation'는 이와 같다.
hexadecimal and octal number formats, and formats that don't require all four bytes to be explicitly written.
알려진 버그
AF_INET6은 IPv4주소를 인식하지 못한다.
대신에 명시적으로 IPv4-mapped IPv6 주소가 반드시 src에 넣어져야 한다.
같이 볼 함수들
getnameinfo( )
'개발자의 기록 노트 > C' 카테고리의 다른 글
pow( ) - 거듭제곱 함수 구현하기(정수 기반) (0) | 2017.12.21 |
---|---|
[네트워크/C reference] Special IPv6 주소 검사 매크로 (0) | 2017.12.14 |
[네트워크/C reference] inet_ntop 함수 (0) | 2017.11.02 |
[C][CURL] CURLOPT_FOLLOWLOCATION 의 버전별 동작 차이 (0) | 2017.08.31 |
[네트워크/C] addrinfo 구조체 (0) | 2017.06.16 |
[네트워크/C] getaddrinfo 함수 (0) | 2017.06.16 |