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 |