글
■ 네트워크 바이트 순서(Big Endian) 과 Dotted-Decimal Notation 간의 상호 변환 함수
(1) 네트워크 주소 변환
: sockaddr_in 구조체의 주소멤버의 데이터 타입은 unsigned long 이다.
따라서 IP 주소를 할당하기 위해 십진수 표현방식(Dotted-Decimal Notation)간에 변환 함수를 적절히 사용해야 한다.
=> inet_ntoa()는 네트워크 바이트 순서의 32비트 값을 Dotted-Decimal Notation의 주소값을 으로 변환한다.
(inet_addr <-> inet_ntoa)
※ inet_addr() 포스팅 참고자료
2012/02/29 - [[ Linux ]/Programming] - inet_addr() - 인터넷 주소 변환
(2) inet_ntoa() 함수 : 네트워크 바이트 순서의 32비트 값을 Dotted-Decimal Notation의 주소값을 으로 변환
● 함수원형 : char *inet_ntoa(struct in_addr addr)
● 리턴 값 : 성공 시 = 변환된 해당 문자열의 포인터
실패 시 = -1
< Source >
< Compile & Result >
- Unsigned long 타입 Big-Endian 32비트 값 "6601a8c0" 의 Dotted-Decimal Notation 값은 192.168.1.102 이다.
- 0x1020304는 Little Endian 타입 이므로 htonl로 Big Endian으로 변환 후 inet_ntoa() 호출하여 1.2.3.4 출력
※ inet_ntoa() 함수의 리턴값 문자열의 저장소는 함수 내부에 선언되어 있는 static 버퍼이다.
따라서 addr2의 주소정보를 가지고 inet_ntoa() 함수를 호출하게 되면 이 버퍼의 값은 re-write 되게 된다.
결과에서 알 수 있듯이, str 포인터를 한번 초기화 하고, 같은값을 2번 출력 했을 때 다른 값이 출력됨을 볼 수 있다.
=> 변경된 문자열 정보를 계속 유지해야 하는 경우에는 따로 복사해서 값을 보관해야한다.
'P rogramming > Linux System' 카테고리의 다른 글
파일 오픈 - open() / creat() (0) | 2012.03.06 |
---|---|
좀비프로세스의 원인과 종료 (0) | 2012.03.02 |
네트워크 주소 변환 - inet_aton() (0) | 2012.02.29 |
네트워크 주소 변환 - inet_addr() (1) | 2012.02.29 |
파일 디스크립터 (File Descriptor) (7) | 2012.02.27 |
RECENT COMMENT