-
주소체계와 데이터 정렬IOT네트워크프로그래밍 2021. 9. 14. 20:22
네트워크 바이트 순서
바이트 순서(Byte Order)
상위 바이트의 값을 메모리에서 어느쪽으로 두느냐에 따라서 구분한다.
Big-Endian
- 상위 바이트 값이 메모리상에 먼저(번지수가 작은 위치) 표시
- 호스트 바이트 순서(Host Byte Order)
Little-Endian
- 하위 바이트 값이 메모리상에 먼저(번지수가 작은 위치) 표시
- 호스트 바이트 순서(Host Byte Order)
데이터 표현 방식에 따라 문제점이 발생한다. 그래서 네트워크 상에서는 Big-endian을 쓴다.
바이트 순서 변환 (Endian Conversion)
unsigned short htons(unsigned short); /*Port 정보의 바이트 순서 변경*/ unsigned short ntohs(unsigned short); /*Port 정보의 바이트 순서 변경*/ unsigend long htonl(unsigned long); /*IP 주소의 바이트 순서 변경*/ unsigned long ntohl(unsigned long); /*IP 주소의 바이트 순서 변경*/
- ‘h’ : host byte order
- ‘n’ : network byte order
- ‘s’ : short (16 bit)
- ‘l’ : long (32 bit)
인터넷 주소 조작하기
inet_addr 함수
Dotted-Decimal Notation(10진수)을 Big-Endian 32 비트 정수형 데이터로 표현
unsigned long inet_addr(const char * string) //성공시 : Big_Endian 32비트 값 , 실패시 : INNADDR_NONE
inet_aton 함수
- inet_addr 함수 보다 개선된 함수
- inet_addr 함수의 리턴된 값을 주소 정보 구조체 sockaddr_in 안에 선언되어 있는 in_addr 구조체의 포인터로 전달
int inet_aton (const char * string, struct in_addr * addr) //성공시 : 0이 아닌 값(true), 실패시 : 0(false)
inet_ntoa 함수
Big-Endian 32비트 정수형 데이터(네트워크 바이트 순서)를 Dotted-Decimal Notation(10진수)로 표현
char * inet_ntoa(struct in_addr addr) 성공시 : 변환된 해당 문자의 포인터, 실패시 : -1
inet_lnaof() 함수
- 네트워크 바이트 순서로 된 소켓 주소의 IP 번호를 네트워크 ID를 삭제한 호스트 ID 번호로 변환한다.
- 이 함수 이용하면 IP 번호의 클래스를 결정할 필요도 없고, 호스트 ID 부분을 추출할 필요가 없다.
EX)
IP 번호 클래스 16진수 Dotted-quad 44.135.86.12 A 0087560C 0.135.86.12 127.0.0.1 A 00000001 0.0.0.1 172.16.23.95 B 0000175F 0.0.23.95 192.168.9.1 C 00000001 0.0.0.1 inet_netof() 함수
- Inet_lanof() 함수와 짝을 이루고 있으며, 호스트 ID 값 대신 네트워크 ID 를 반환하는것 이외에 다른차이점 없음
EX)
IP 번호 클래스 16진수 Dotted-quad 44.135.86.12 A 0000002C 0.0.0.44 127.0.0.1 A 0000007F 0.0.0.127 172.16.23.95 B 0000AC10 0.0.172.16 192.168.9.1 C 00C0A809 0.192.168.9 'IOT네트워크프로그래밍' 카테고리의 다른 글
다중 접속 서버 (0) 2021.10.05 UDP기반의 Client/Server (0) 2021.09.28 TCP 기반의 Client / Server (0) 2021.09.28 도메인 이름과 IP 주소 변환 (0) 2021.09.28 Socket (0) 2021.09.14