코딩/Network

[네트워크] IP 주소 변환 함수

나야, 웅이 2023. 4. 14. 16:53
728x90
반응형
SMALL

IP 주소 입력

▶네트워크 프로그램에서 IP 주소를 입력받을 때는

명령행 인수를 사용하거나 운영체제가 제공하는 입력용 컨트롤을 이용

▶이때 IP 주소를 32비트(IPv4) 또는 128비트(IPv6) 숫자로 변환해야 함

 

 

 

 

IP 주소 변환 함수

inet_pton

[in] Family

[in] pszAddrString

변환할 IP주소의 텍스트를 포함하는 문자열에 대한 포인터

[out] pAddrBuf

IP 주소의 숫자 이진 표현을 저장할 버퍼에 대한 포인터

inet_ntop

[in] pAddr

문자열로 변환할 네트워크 바이트의 IP 주소에 대한 포인터

 

[out] pStringBuf

IP 주소의 NULL로 종료된 문자열 표현을 저장할 버퍼에 대한 포인터

 

[in] StringBufSize

입력 시 pStringBuf 매개 변수가 가리키는 버퍼의 길이

	// 원래의 IPv4 주소 출력
	const char* ipv4test = "147.46.114.70";
	printf("IPv4 주소(변환 전) = %s\n", ipv4test);

		// inet_pton() 함수 연습
		struct in_addr ipv4num;
		inet_pton(AF_INET, ipv4test, &ipv4num);
		printf("IPv4 주소(변환 후) = %#x\n", ipv4num.s_addr);

		// inet_ntop() 함수 연습
		char ipv4str[INET_ADDRSTRLEN];
		inet_ntop(AF_INET, &ipv4num, ipv4str, sizeof(ipv4str));
		printf("IPv4 주소(다시 변환 후) = %s\n", ipv4str);

 

 


 

 

바이트 정렬 함수와 IP 주소 변환 함수 사용 예

1) 응용 프로그램이 소켓 주소 구조체를 초기화하고, 소켓 함수에 넘겨 주는 경우

htons  함수는  u_short  호스트에서 TCP/IP 네트워크 바이트 순서(big-endian)로 변환합니다.

 

 

2) 소켓 함수가 소켓 주소 구조체를 입력으로 받아 내용을 채우면, 응용 프로그램이 이를 출력 등의 목적으로 사용하는 경우


IP 주소 변환 함수 실습

#include "..\..\Common.h"

int main(int argc, char* argv[])
{
	// 윈속 초기화
	WSADATA wsa;
	if (0 != WSAStartup(MAKEWORD(2, 2), &wsa))
		return 1;

	/*----------------*/
	/* IPv4 변환 연습 */
	/*----------------*/
	// 원래의 IPv4 주소 출력
	const char* ipv4test = "147.46.114.70";
	printf("IPv4 주소(변환 전) = %s\n", ipv4test);

	// inet_pton() 함수 연습
	struct in_addr ipv4num;
	inet_pton(AF_INET, ipv4test, &ipv4num);
	printf("IPv4 주소(변환 후) = %#x\n", ipv4num.s_addr);

	// inet_ntop() 함수 연습
	char ipv4str[INET_ADDRSTRLEN];
	inet_ntop(AF_INET, &ipv4num, ipv4str, sizeof(ipv4str));
	printf("IPv4 주소(다시 변환 후) = %s\n", ipv4str);
	printf("\n");

	/*----------------*/
	/* IPv6 변환 연습 */
	/*----------------*/
	// 원래의 IPv6 주소 출력
	const char* ipv6test = "2001:0230:abcd:ffab:0023:eb00:ffff:1111";
	printf("IPv6 주소(변환 전) = %s\n", ipv6test);

	// inet_pton() 함수 연습
	struct in6_addr ipv6num;
	inet_pton(AF_INET6, ipv6test, &ipv6num);
	printf("IPv6 주소(변환 후) = 0x");
	for (int i = 0; i < 16; i++)
		printf("%02x", ipv6num.s6_addr[i]);
	printf("\n");

	// inet_ntop() 함수 연습
	char ipv6str[INET6_ADDRSTRLEN];
	inet_ntop(AF_INET6, &ipv6num, ipv6str, sizeof(ipv6str));
	printf("IPv6 주소(다시 변환 후) = %s\n", ipv6str);

	// 윈속 종료
	WSACleanup();
	return 0;
}

728x90
반응형
LIST