728x90

바이트 오더

- 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;
}

 

728x90

+ Recent posts