반응형
본 글에서는 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
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
리눅스 네트워크 프로그래밍 - CAN(Controller Area Network) 통신 (2) | 2020.04.27 |
---|---|
리눅스 네트워크 프로그래밍 - UDP6(UDP over IPv6) 송수신 (0) | 2020.03.04 |
리눅스 네트워크 프로그래밍 - 네트워크 인터페이스 비활성화하기 (0) | 2020.02.16 |
리눅스 네트워크 프로그래밍 - 네트워크 인터페이스 활성화하기 (0) | 2020.02.15 |
리눅스 네트워크 프로그래밍 - 네트워크 인터페이스 MAC 주소 확인하기 (0) | 2020.02.15 |
리눅스 네트워크 프로그래밍 - 네트워크 인터페이스 MAC 주소 설정하기 (0) | 2020.02.15 |
리눅스 네트워크 프로그래밍 - 네트워크 인터페이스 IPv6 주소 설정하기 (0) | 2020.02.09 |
리눅스 네트워크 프로그래밍 - 네트워크 인터페이스 IPv6 주소 확인하기 (0) | 2020.02.08 |