바이트 오더
- CPU, 네트워크 등에서 바이트를 저장하는 순서에 차이가 있을 수 있음
- 두 호스트가 데이터를 주고받을 때 저장하는 순서의 타입을 맞춰야 제대로 처리할 수 있음
- CPU에 따라 달라지는 정수의 표현
-> 정수 1을 저장하는 방법에는 2가지가 있음
-> 00000000 00000000 00000000 00000001 / 00000001 00000000 00000000 00000000
-> 앞의 방식을 빅 엔디안, 뒤의 방식을 리틀 엔디안이라고 함
-> 빅 엔디안 : 상위 바이트의 값을 작은 번지수에 저장
-> 리틀 엔디안 : 상위 바이트의 값을 큰 번지수에 저장
- 네트워크 바이트 오더(순서)는 빅 엔디안이 기준
- 소켓이 read, write할때 시스템의 오더에 맞춰서 변경해줌
바이트 순서의 변환
- 소켓이 생성이 생성되고 나면 read,write에서 바이트 오더를 변경해주지만 그 전에 생성 과정에 필요한 IP, PORT 정보는 따로 처리를 해줘야 함
- 바이트 변환 함수
unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned long);
unsigned long ntohl(unsigned long);
-> htons : short 형 데이터의 바이트 순서를 호스트 바이트 순서에서 네트워크 바이트 순서로 바꿈
-> ntohs : short 형 데이터의 바이트 순서를 네트워크 바이트 순서에서 호스트 바이트 순서로 바꿈
-> htonl : long 형 데이터의 바이트 순서를 호스트 바이트 순서에서 네트워크 바이트 순서로 바꿈
-> ntohl : long 형 데이터의 바이트 순서를 네트워크 바이트 순서에서 호스트 바이트 순서로 바꿈
-> short 형 데이터(포트정보), long 형 데이터(IP 정보)에 사용
- 호스트 바이트 순서는 CPU에 따라 결정
#include <stdio.h>
#include <winsock2.h>
int main()
{
unsigned short host_port=0x1234;
unsigned short net_port;
unsigned long host_addr=0x12345678;
unsigned long net_addr;
net_port=htons(host_port);
net_addr=htonl(host_addr);
printf("포트 정보 : 호스트 오더: %#x \n", host_port);
printf("포트 정보 : 네트워크 오더: %#x \n", net_port);
printf("IP 정보 : 호스트 오더: %#lx \n", host_addr);
printf("IP 정보 : 네트워크 오더: %#lx \n", net_addr);
return 0;
}
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 04-1. TCP와 UDP에 대한 이해 (0) | 2021.02.14 |
---|---|
열혈 TCP/IP 03-4. 인터넷 주소의 초기화와 할당 (0) | 2021.02.09 |
열혈 TCP/IP 03-2. 주소정보의 표현 (0) | 2021.02.02 |
열혈 TCP/IP 03-1. 소켓에 할당되는 IP주소와 PORT번호 (0) | 2021.02.02 |
열혈 TCP/IP 02-1. 소켓의 프로토콜과 그에 따른 데이터 전송 특성 (0) | 2021.01.31 |