[[프로그래밍_NOTE]]/Window Programing

네트워크 바이트 순서

갑빠돌격기 2008. 7. 30. 13:45

/***********************************************
   참고 : TCP/IP 소켓 프로그래밍 / 윤성우 | 저
************************************************/

[1]. 시스템이 내부적으로 데이터를 처리하는 방식 2가지 //

   (1). Big - Endian 표현
  ┌───┬───┬───┬───┐
  │ 0x12  │ 0x34  │ 0x56  │ 0x78  │       //ex : Motorola 68000계열
  └───┴───┴───┴───┘

   (2). Little - Endian 표현
  ┌───┬───┬───┬───┐
  │  0x78 │ 0x56  │ 0x34  │ 0x12  │      //ex : Intel X86 계열
  └───┴───┴───┴───┘

     /*
     데이터를 상이하게 처리하는 두 호스트 간의 통신에서
    주고 받는 데이터를 서로 다른 값으로 해석하지 않기 위해
    통일된 방식으로 데이터를 전송하기로 약속하였는데
    이를 "네트워크 바이트 순서 (NetWork Byte Order)" 라고 한다.
    현재 네트워크 바이트 순서는 Big - Endian 방식만을 사용하기로 약속되어 있다.
     */

[2]. 바이트 순서 변환

/*
     'h' : host      byte order
     'n' : network byte order
     's' : short     (16bit)
     'l'  : long      (32bit)
*/
ex)
htons ==>  h to n s  ==> host byte order 를 network byte orde로...short 타입으로
htonl  ==>  h to n l   ==> host byte order 를 network byte order로..long  타입으로
ntohs ==>  n to h s  ==> network byte order를 host byte order로.. short 타입으로

practice)

/////////////////////////////////////////////////
// endian_conv.c
// written by SW. YOON
// TCP/IP 소켓 프로그래밍 / 윤성우 | 저

- 컴파일시 ws2_32.lib를 추가 시켜주어야 함
/////////////////////////////////////////////////

/* source
#include<stdio.h>
#include<WINSOCK2.H>

int main()
{
 short host_port_order = 0x1234;
 short  net_port_order = htons(host_port_order);

 long host_add_order   = 0x12345678;
 long  net_add_order   = htonl(host_add_order);

 printf("    Host ordered port : %x\n" , host_port_order);
 printf(" Network ordered port : %x\n" , net_port_order);

 printf("    Host ordered Address : %x\n" , host_add_order);
 printf(" Network ordered Address : %x\n" , net_add_order);
}

/** result  *************************************
     Host ordered port : 1234
Network ordered port : 3412

     Host ordered Address : 12345678
Network ordered Address : 78563412
***********************************************/