IOT네트워크프로그래밍

주소체계와 데이터 정렬

CMS419 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