리눅스 네트워크 프로그래밍 - inet_ntop() : IPv6 주소를 문자열로 변환

반응형

본 글에서는 IPv6 주소 바이트열을 문자열로 변환해 주는 inet_ntop() 함수에 대해 소개한다.

 

다음은 IPv6 주소 바이트열을 문자열로 변환하여 출력하는 예제 프로그램이다.

 

  • IPv6_ALEN : IPv6 주소는 128비트, 즉 16바이트 길이를 가진다.
  • IPv6_ADDR_STR_MAX_LEN : 최대 길이의 문자열로 표현된다고 가정하면, IPv6 주소는 16바이트 길이를 가지므로, 4비트 당 한 글자씩 총 32글자가 필요하다. 또한 4글자 마다 사이에 콜론이 들어갈 수 있으므로 최대 7개의 콜론이 들어갈 수 있다. 따라서 IPv6 주소 문자열의 최대 길이는 (16 * 2) + 7 = 39 바이트가 된다. 문자열을 저장하기 위한 배열은 마지막 종료 문자까지 고려하여 39 + 1 = 40 바이트의 길이를 가져야 한다.
  • inet_ntop() 함수 사용을 위해서는 arpa/inet.h 헤더 파일을 인클루드 해야 한다.
  • inet_ntop() 함수 리턴값은 해당 함수의 3번째 인자로 넘겨진 문자열 저장 버퍼에 대한 포인터이다.

 

#include <arpa/inet.h>
#include <errno.h>
#include <stdint.h>
#include <stdio.h>

/// IPv6 주소 길이 (바이트수)
#define IPv6_ALEN 16
/// IPv6 주소 문자열 최대 길이
#define IPv6_ADDR_STR_MAX_LEN ((IPv6_ALEN * 2) + 7)

/**
 * IPv6 주소를 문자열 형태로 화면에 출력한다.
 * @param[in] ipv6_addr  출력할 IPv6 주소 바이트열(16바이트 길이)
 * @param[in] prefix_len 출력할 IPv6 주소의 프리픽스 길이 (비트 단위, ~64)
 */
void PrintIPv6Address(const uint8_t ipv6_addr[], const uint32_t prefix_len)
{
  char ipv6_addr_str[IPv6_ADDR_STR_MAX_LEN + 1];
  const char *ptr = inet_ntop(AF_INET6, ipv6_addr, ipv6_addr_str, sizeof(ipv6_addr_str));
  if (ptr == NULL) {
    perror("Fail to inet_ntop() ");
    return;
  }
  printf("IPv6 address - %s/%u\n", ptr, prefix_len);
}

int main(int argc, char *argv[])
{
  uint8_t ipv6_addr[IPv6_ALEN] = {0xfe,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0xff,0xfe,0x03,0x04,0x05}; 
  PrintIPv6Address(ipv6_addr, 64);
  return 0;
}

 

 

위 코드를 실행하면 다음과 같이 문자열 형식으로 출력된다.

$ ./a.out
IPv6 Address - fe80::1:2ff:fe03:405/64

 

댓글

Designed by JB FACTORY