본문 바로가기
Programming/Socket

[C/C++/소켓 프로그래밍] IP 주소 형식 변환 aton() ntoa() 이진형식으로의 변환

by whitele 2021. 3. 10.
반응형

IP란?

ip는 컴퓨터 네트워크에서 서로를 인지하고 통신하기 위해 부여하는 주소같은 것이다. Internet Protocol의 약자로 인터넷 통신 규약을 가리키는 말이다. 일상에서 전화번호와 같은 존재이다. 현재 IP는 v4와 v6로 나뉘며 v4는 0~255사이의 십진수를 쓰며 .으로 각각을 구분한다 (0.0.0.0~255.255.255.255) 이중 특정 ip는 예약되어 할당되지 않는 ip도 있지만 전부 사용한다면 약 43억개의 ip를 사용할 수 있다. v6는 v4로는 모든 기기에 할당할 ip가 부족하게 되자 나온 새로운 버젼이다. 기존 32비트에서 128비트로 증가하였다. 현재 ipv6는 우리나라에서 많이 쓰이진 않지만 아직은 과도기적 시기로 점차 대체해 나가는 중이다. v4에서 v6로 가면서 :로 구분하거나 16진수를 쓰고 기타 패킷 헤더가 일부 변경되는 등 변화된 부분이 있다. 16진수는 아직 많이 쓰이지 않기 때문에 앞으로의 설명은 v4로 진행한다.

주소 변환의 이유

 네트워크 NIC(네트워크 랜카드)는 바이트 순으로 된 이진 형식의 IP주소를 사용한다. 유저는 보통 10진수로 된 ip주소를 사용한다. 때문에 ex192.168.0.0같은 ip를 이진으로 된 바이트 시퀀스로 바꿀 필요가 있다.

aton()의 헤더파일 및 함수 기본 사용

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
(int형 반환) inet_aton(const char *decIp,struct in_addr *binIp);

const char *decIp: 10진수로 표현된 문자열 형식의 ip

struct in_addr *binIp:2진수로 표현된 Ip를 구조체 형식으로 저장 (big-endian형식)

 10진수로 된 ip 문자열을 받으며 이진수 IP를 구조체 형식으로 반환한다. 성공시 0이외의 값 실패시 0을 반환한다.

ntoa()의 헤더파일 및 함수 기본 사용

#include <arpa/inet.h>
(char* 형 반환) inet_ntoa(struct in_addr ip);

 2진수로된 ip를 입력하여 10진수 문자열을 반환한다.

struct in_addr

#include <arpa/inet.h>
struct sockaddr{
	u_long s_addr;
}

aton예제

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
        const char *ipAddr="192.168.0.0";
        struct in_addr binIp;
        if(inet_aton(ipAddr,&binIp)!=0)
                printf("changed\n");
        printf("ipAddr:%s,binIp:%x\n",ipAddr,binIp.s_addr);
        return 0;
}  

실행 결과

728x90
반응형

댓글