본문 바로가기

Study/TCP/IP

인터넷 주소 조작하기

sockaddr_in 안에서 주소를 나타내기 위해 선언되어 있는 멤버의 데이터 타입이 unsigned long이었다. 따라서 우리는 IP 주소 정보를 할당하기 위해 unsigned long 타입으로 IP 주소를 표현할 수 있어야 한다.

하지만 직접 계산하지 않아도 인터넷 주소를 조작해 주는 여러 함수들이 존재한다. Dotted-Decimal Notation의 주소 값을 unsigned long 타입으로 변환해 줄 뿐만 아니라, 네트워크 바이트 순서로의 변환도 알아서 해준다.

inet_addr() : Dotted-Decimal Notation을 Big-Endian 32비트 값으로 변환
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

unsigned long inet_addr(const char *string);
성공시 Big_Endian 32비트 값, 오류 발생 시 INADDR_NONE 리턴
인자 값으로 Dotted-Decimal Notation 문자열의 포인터를 넘겨주게 되면, 해당하는 unsigned long 타입의 데이터 값을 리턴한다.

inet_aton() : inet_addr 함수 보다 개선된 데이터 변환 함수
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

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

성공시 0이 아닌 값(true), 실패 시 0(false)이 리턴된다.
inet_addr 함수를 사용할 경우 변환된 데이터가 unsigned long 타입의 값으로 리턴되기 때문에, 리턴된 값을 주소 정보 구조체 sockaddr_in 안에 선언되어 있는 in_addr구조체 안에 대입하는 과정을 거쳐야 한다. 즉, 변환된 값을 얻어오고 다시 대입하는 과정을 거쳐야 한다.

그러나 inet_aton 함수를 사용할 경우 대입하는 과정을 따로 거치지 않아도 된다. 인자로 in_addr 구조체의 포인터를 전달하고 있기 때문에 자동적으로 변환된 값이 대입된다.

inet_ntoa() : 네트워크 바이트 순서의 32비트 값을 Dotted-Decimal Notation으로 변환
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

char *inet_ntoa(struct in_addr addr)

성공 시 변환된 해당 문자열의 포인터를 실패 시 -1을 리턴
주의해야 할 사항은 리턴 타입이 문자열의 포인터라는 데에 있다. 문자열의 포인터가 리턴 된다는 것은 문자열의 저장소가 어딘가에 존재한다는 의미가 되는데, 우리는 직접 제공하지 않고 이 함수를 호출하게 된다. 그리고 문자열의 포인터만 얻어내게 된다. 여기서 문자열의 저장소는 함수 내부의 선언되어 있는 static 버퍼가 된다. 따라서 만약에 다시 한번 다른 주소 정보를 가지고 inet_ntoa 함수를 호출하게 되면 이 버퍼는 다른 데이터로 채워지게 된다. 결국 다시 한번 inet_ntoa 함수가 호출되기 전까지만 리턴된 포인터가 유효하다고 생각할 수 있다.

'Study > TCP/IP' 카테고리의 다른 글

인터넷 주소 초기화  (3) 2008.02.16
네트워크 바이트 순서  (0) 2008.02.16
주소 정보의 표현  (0) 2008.02.16
Port란,  (0) 2008.02.16
Internet Address  (0) 2008.02.16