반응형

바이트 순서와 네트워크 바이트 순서(2)

 

 

빅 엔디안 시스템에서 0x12, 0x34의 조합으로 만들어지는 값은

 

리틀 엔디안 시스템에서 0x34, 0x12의 조합으로 만들어지는 값과 같다.

 

즉, 저장되는 순서가 서로 바뀌어야 동일한 값으로 인식된다.

 

예를 들어 

 

빅 엔디안 시스템에서 73, 94를 보냈다.

 

하지만

 

리틀 엔디안 시스템에서는 94, 73으로 받는다.

 

이럴 경우 사람의 입장으로써 매우 매우 번거롭다.

 

그래서 네트워크를 통해서 데이터를 전송할 때에는

 

통일된 기준으로 데이터를 전송하기로 약속했다.

 

그리고 이 약속을 "네트워크 바이트 순서(Network Byte Order)"라고 한다.

 

-

 

※ 네트워크 바이트 순서(Network Byte Order)  ※

 

네트워크 바이트 순서 빅 엔디안 방식으로 통일됐다.

 

즉, 네트워크상으로 데이터를 전송할 때에는 

 

데이터의 배열을 빅 엔디안 기준으로 변경해서 송수신하기로 약속했다.

 

그래서 모든 컴퓨터 수신된 데이터 네트워크 바이트 순서로 정렬되어 있음을 명심하고,

 

리틀 엔디안 시스템에서는 데이터를 전송하기 전 빅 엔디안 방식으로 데이터를 재 정렬해야 한다.

 

쉽게, 호스트 순서 시스템에 영향을 받아 리틀 엔디안 방식 빅 엔디안 방식으로 나뉜다.

 

반면 네트워크 바이트 순서 빅 엔디안 방식을 사용하기로 약속되어, 빅 엔디안 방식이다.

 

-

 

※ 바이트 순서의 변환 ※

 

이제 sockaddr_in 구조체 변수에 값을 채우기 앞서 

 

네트워크 바이트 순서로 변환해서 저장해야 하는 이유를 안다.

 

그럼 이번에는 바이트 순서의 변환을 돕는 함수들을 아래의 사진으로 봐보자.

 

-

 

 

-

 

위의 함수들의 이름만 봐도 어떤 의미인지 알 수 있지만,

 

입문자 또는 초보자들을 위해 위에서부터 아래로 총 4개를 한글로 설명하자면,

 

-

 

short형 데이터를 호스트 바이트 순서 -> 네트워크 바이트 순서로 변환

 

short형 데이터를 네트워크 바이트 순서 -> 호스트 바이트 순서로 변환

 

long형 데이터를 호스트 바이트 순서 -> 네트워크 바이트 순서로 변환

 

long형 데이터를 네트워크 바이트 순서 -> 호스트 바이트 순서로 변환

 

-

 

일반 적으로 뒤에 's'가 붙는 함수는 's' 2byte short를 의미하므로 PORT번호의 변환에 사용되고

 

뒤에 영어 'L'의 소문자인 'l'이 붙는 함수는 'l' 4byte long를 의미하므로 IP주소 변환에 사용된다.

 

-

 

그리고 자신의 시스템이 빅 엔디안 방식으로 동작하는 경우

 

sockaddr_in 구조체 변수에 값을 채울 때 네트워크 바이트 순서

 

즉, 빅 엔디안 방식의 정렬을 사용할 필요가 없겠지만

 

어느 방식의 시스템에서도 영향받지 않고 동작하는 코드를 작성해야 하기 때문

 

빅 엔디안 방식 시스템에서도 호스트 바이트 순서 네트워크 바이트 순서로 

 

변환하는 과정을 거쳐야 한다.

 

-

 

다음 포스팅에서 간단한 예제를 통해서 위 사진에 나온 함수들을 호출해보자.

반응형

+ Recent posts