안녕하세요 허언증입니다.
주소를 표현하기 위해 사용하는 구조체 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을 리턴합니다.
출처 : 네이버_해커남
'# Language > [ C & C++ ]' 카테고리의 다른 글
[C & C++] send() , sendto() 차이점 (feat. network_socket) (0) | 2019.12.05 |
---|---|
[C & C++] ZeroMemory() , memset() 차이점 (feat. 구조체 초기화) (0) | 2019.12.05 |
[C & C++] 포인터 정리 (0) | 2019.11.05 |
[C & C++] STL 반복자 iterator (0) | 2019.11.05 |
[C & C++] enum 열거형 (0) | 2019.11.05 |