일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Brute Force
- union find
- 다익스트라
- binary search
- Hash
- 이진탐색
- two pointer
- Stored Procedure
- DP
- 스토어드 프로시저
- Trie
- Dijkstra
- MYSQL
- 그래프
- String
- Two Points
- SQL
- Today
- Total
codingfarm
네트워크 바이트 순서(Network byte order) 본문
www.tcpschool.com/c/c_refer_endian
forum.falinux.com/zbxe/index.php?document_srl=431494&mid=C_LIB
바이트 정렬(Byte Order)
- 컴퓨터에서 연속된 데이터를 byte단위로 순서대로 저장하는것
- byte가 저장되는 순서에 따라 little endianess와 big endianess로 나뉨
빅 앤디언(Big Endianess)
- 낮은 주소에 데이터의 높은 바이트(MSB, Most Significant Bit)부터 저장하는 방식
- 평소 숫자를 사용하는 선형 방식과 같은 방식입니다.
- 메모리에 저장된 순서 그대로 읽을 수 있으며, 이해하기가 쉽다
- SPARC을 포함한 대부분의 RISC CPU 계열에서는 이 방식으로 데이터를 저장
- TCP/IP 네트워크에서는 Big Endianess을 사용함
가령 0x12345678 이라는 32bit 크기의 데이터가 존재 할 경우
0x12, 0x34, 0x56, 0x78로 나뉜다
리틀 엔디언(Little Endianess)
- 낮은 주소에 데이터의 낮은 바이트(LSB, Least Significant Bit)부터 저장하는 방식
- 평소 우리가 숫자를 사용하는 선형 방식과는 반대로 거꾸로 읽어야 함
- 대부분의 인텔 CPU 계열에서는 이 방식으로 데이터를 저장
가령 0x12345678 이라는 32bit 크기의 데이터가 존재 할 경우
Byte Order 확인
1
2
3
4
5
6
|
int i;
int test = 0x12345678;
char* ptr = (char*)&test; // 1 바이트만을 가리키는 포인터를 생성함.
for (i = 0; i < sizeof(int); i++)
printf("%x", ptr[i]); // 1 바이트씩 순서대로 그 값을 출력함.
|
cs |
사용중인 시스템이
빅 엔디안일 경우 : 12345678 출력
리틀 엔디안일 경우 : 78563412 출력
Host to Network 함수
ehpub.co.kr/tag/htonl-%ED%95%A8%EC%88%98/
소켓 프로그래밍의 bind나 connect 함수에서 htonl이나 htons라는 함수를 볼 수 있다.
이 함수는 호스트(Host) 바이트 순서를 네트워크(Network) 바이트 순서로 바꾸는 함수이다.
각각 32bit(Long)및 16bit(Short) 단위로 데이터를 변환한다.
앞서 TCP/IP 네트워크에서는 big endianess, 인텔 계열의 CPU 에서는 little endianess의 byte order를 따른다 설명했다.
그렇기에 byte order를 전환하는 작업을 수행해야 네트워크에서 값을 해석할 수 있다.
이때 사용하는 함수가 htonl과 htons이다.
1
2
|
u_long htonl( u_long hostlong );
u_short htons( u_short hostshort );
|
cs |
htonl : host byte order형의 IPv4 주소를 network byte order 형으로 변환
htons : host byte order형의 IP 포트 번호를 network byte order 형으로 변환
'TCP IP 소켓 프로그래밍' 카테고리의 다른 글
4. 소켓 네트워크 프로그램 개발 - 8. 연결 종료(close 함수) (0) | 2021.05.11 |
---|---|
4. 소켓 네트워크 프로그램 개발 - 7. 데이터 읽고 쓰기(read/write 함수) (0) | 2021.05.11 |
4. 소켓 네트워크 프로그램 개발 - 6. 연결 요청(connect 함수) (0) | 2021.05.10 |
4. 소켓 네트워크 프로그램 개발 - 5. 연결 대기(accept 함수) (0) | 2021.05.10 |
4. 소켓 네트워크 프로그램 개발 - 4. 수신 대기열 생성(listen 함수) (0) | 2021.05.10 |