C언어 short 네트워크 바이트 순서를 호스트 바이트 순서로 변환 함수 ntohs()

2020. 3. 16. 10:12 컴퓨터/프로그래밍

C함수 short 네트워크 바이트 순서를 호스트 바이트 순서로 변환 ntohs()

short 메모리 값을 호스트 바이트 순서에서 네트워크 바이트 순서로 변경합니다.

  • 헤더: arpa/inet.h
  • 형태:uint16_t ntohs(uint16_t netshort)
  • 인수:uint16_t netshort short형 네트워크 바이트 순서의 데이터
  • 반환: -1 == 실패, -1 이외 short 형 호스트 바이트 순서로 변경한 데이터
caution

변수 타입별 함수 구분

함수 구분 설명
uint32_t htonl(uint32_t hostlong) long 형 호스트 바이트 순서 데이터를 네트워크 바이트 순서값 구함
uint16_t htons(uint16_t hostshort) short 형 호스트 바이트 순서 데이터를 네트워크 바이트 순서값 구함
uint32_t ntohl(uint32_t netlong) long 형 네트워크 바이트 순서 데이터를 호스트 바이트 순서 데이터 값 구함
uint16_t ntohs(uint16_t netshort) short 형 네트워크 바이트 순서 데이터를 호스트 바이트 순서 데이터 값 구함

호스트 바이트 순서란 지금 사용 중인 시스템에서 2바이트 이상의 큰 숫자 변수에 대해 바이트를 메모리 상에 어떻게 배치하는지 순서를 말하며, 네트워크 바이트 순서는 2 바이트 이상의 큰 숫자에 대해 어떤 바이트부터 전송할지에 대한 순서를 말합니다. 

 1 바이트 크기의 자료를 다른 시스템으로 전송할 때에는 문제가 없습니다만 2 바이트 이상의 큰 순자를 전송할 때, 큰 단위를 먼저 전송할 지 아니면 작은 단위의 값을 먼저 전송할 지를 미리 정하지 않으면 문제가 발생합니다. 

 즉, 16진수 값 0x1234와 같은 두 바이트 값은 시스템에 따라서 메모리에 저장할 때 작은 단위의 값부터 0x34, 0x12 순서로 저장하는 Little-Endian을 사용하는 시스템이 있는가 하면, 반대로 큰 단위의 값부터 0x12, 0x34식으로 저장하는 Big_Endian 시스템이 있습니다. 

이렇게 바이트 배열 순서가 서로 다르다면 2바이트 이상의 큰 숫자를 전송할 때 어느 바이트가 큰 단위의 값인지를 모른다면 혼란이 발생할 것이므로 당연히 서로 전송하는 방식을 맞추어야 하는데, 네트워크에서는 Big-Endian을 사용합니다.

그러므로 Big-Endian을 사용하는 시스템은 그대로 전송하면 되지만 Little-Endian을 사용하는 호스트에서는 바이트 순서를 바꾸어서 전송해 주어야 합니다. 

그러나 이것을 소스코드에서 특정 시스템에 맞추어 코딩한다면 시스템에 독립적인 프로그램을 작성할 수 없습니다. 대신에 시스템에서 제공되는 라이브러리를 이용하여 네트워크 바이트 순서로 변경된 값을 구하는 것이 소스코드를 수정할 필요가 없어서 편리합니다. 

htons() 함수가 바로 이와 같은 작업을 대신해 주는 함수로 Host의 Byte 순서를 To Network Byte 순서로 바꾸어 준다는 뜻입니다. 뒤의 s 는 short로 2바이트 변수에 대해 바이트 순서를 네트워크 바이트 순서로 변경해 주는 함수가 되겠습니다.

예제

#include <stdio.h>
#include <arpa/inet.h>

int main( void)
{           
   short host_byte    = 0x3412;
   
     printf( "%x to %x\n", host_byte, ntohs( host_byte));

   return 0;
}

실행 결과

]$ ./a.out
3412 to 1234
]$
이 댓글을 비밀 댓글로