제임스딘딘의
Tech & Life

개발자의 기록 노트/C

[네트워크/C reference] inet_pton 함수

제임스-딘딘 2017. 11. 12. 01:07

기능 요약 (Summary)

inet_pton( ) 함수는 사람이 알아보기 쉬운 텍스트(human-readable text)형태의 IPv4 와 IPv6 주소를 binary 형태로 변환 하는 기능을 한다.



헤더 (Header files)

이 함수를 사용하려면 다음 헤더파일을 포함시킨다.


#include <arpa/inet.h>


API 원형 (API Prototype)

3개의 파라미터를 가지는 함수이다.

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( )

getaddrinfo( )

inet_ntop( )