# Language/[ C & C++ ]

[C & C++] inet_addr(), inet_aton(), inet_ntoa()

이론과 실습 사이 2019. 12. 3. 23:59
반응형

안녕하세요 허언증입니다.

 

 

주소를 표현하기 위해 사용하는 구조체 sockaddr_in 안에서 IP를 나타내기 위한

   

데이터 타입은 unsigned long형입니다.

   

그래서 IP주소 정보를 할당 하기 위해서 문자열의 "192.168.10.10"을 unsigned long

   

으로 바꿔주어야 합니다.

   

참고로 "192.168.10.10"의 표현방식은 Dotted-Decimal Notation 즉, 십진수 표현 방식

   

이라고 말합니다.

   

계산을 해서 unsigned long으로 바꿀 수 있지만 그렇게 할 필요가 없습니다.

   

바꿔주는 함수가 있기 때문이죠

   

이런 함수들을 인터넷 주소 조작 함수라고 하는데 이 함수들은 단순히 변환만

   

시켜주는게 아니라 바이트 순서를 바꿔주는 일도 해줍니다.

   

그럼 하나하나 살펴보겠습니다.

   

1. inet_addr()함수

   

이 함수는 Dotte-Decimal Notation 형식을 빅엔디안 32비트 값으로 변환시켜줍니다.

   

unsigned long inet_addr(const char *string);

   

위가 함수의 원형인데 함수 파라미터 값에 IP주소 문자열의 시작주소를 넣어주면

   

이 함수가 알아서 빅엔디안 32비트 unsigned long 형의 값으로 만들어줍니다.

   

성공하면 빅엔디안 형식의 32비트 값을, 실패하면 INADDR_NONE을 리턴합니다.

   

INADDR_NONE은 실제로 -1로 선언되어 있습니다.

   

   

2. inet_aton()함수

   

이 함수는 기본적으로 주소 문자열을 빅엔디안 32비트 값으로 변환 시켜주는건

   

inet_addr()함수와 같지만 다른 점이 있습니다.

   

inet_addr()함수는 변환된 값을 sockaddr_in 구조체의 맴버변수 안에 또 선언된

   

in_addr 구조체에 값을 대입해주어야 합니다.

   

하지만 inet_aton()함수는 자동으로 값을 대입시켜줍니다.

   

따라서 따로 대입해야 할 필요가 없어집니다.

   

먼저 이것이 함수의 원형입니다.

   

int inet_aton(const char *string, struct in_addr *addr);

   

첫번째 파라미터 값은 주소 문자열이 있는 포인터변수가 들어가고

   

두번째 파라미터 값은 구조체 맴버변수중 주소값이 들어가는 맴버변수의

   

주소값을 넣어주시면 됩니다.

   

함수를 성공시키면 0이 아닌값, 실패하면 0이 리턴됩니다.

   

이 함수는 inet_addr()함수보다 편리하게 사용할 수 있습니다.

   

   

3. inet_ntoa() 함수

   

이 함수는 네트워크 바이트 순서의 32비트 값을 Dotted-Decimal Notation으로 변환

   

시켜주는 함수 입니다.

   

inet_aton()함수와 반대되는 개념이죠.

   

char * inet_ntoa(struct in_addr addr);

   

이것이 함수의 원형입니다.

   

파라미터값은 구조체의 맴버변수 중 주소 문자열이 있는 맴버변수를 넣어주면 됩니다.

   

이 함수를 사용할 때 자세히 보셔야 할 것이 있는데 리턴 타입이 문자열의 포인터 라는 것입니다.

   

문자열의 포인터가 리턴 된다는 의미는 문자열을 저장한 장소가 어딘가에 존재한다는

   

의미가 되는데, 우리는 직접 제공하지 않고 이 함수를 호출하게 됩니다.

   

그리고 문자열의 포인터만 얻어내면 되는 거죠.

   

그럼 문자열이 저장된 공간이 어디 있는지 궁금할 수 있는데 이 함수가 정의될 때

   

그 안에 static 버퍼가 선언되어 있어서 그곳에 저장이 되는 것 입니다.

   

만약 다시 한번 다른 주소 정보를 가지고 이 함수를 호출하면 이 버퍼는 다른 데이터로

   

채워지겠죠?

   

그 말은 다시 한번 이 함수가 호출 되기 전까지만 리턴 된 포인터가 유효하다는

   

말로 이해할 수 있으실 겁니다.

   

이 함수가 성공했을 시 해당 문자열의 포인터를 리턴하고, 실패하면 -1을 리턴합니다.

 

 

출처 : 네이버_해커남

반응형