인터넷 주소 조작하기  -  2008.02.16 22:51

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
주소 정보의 표현  (0) 2008.02.16
Port란,  (0) 2008.02.16
Internet Address  (0) 2008.02.16

Name   Password   Homepage   Secret