반응형

바이트 순서(byte order)

  • 호스트 바이트 순서 : 컴퓨터가 내부 메모리에 숫자를 저장하는 순서
    • CPU의 종류에 따라 다름
      • Little Endian : 80x86 계열의 CPU (ex. 50146 > 0xC3E2 : E2, C3순서(하위 바이트 부터)로 저장)
      • Big Endian : MC68000 계열의 CPU (ex. 50146 > 0xC3E2 : C3, E2순서(상위 바이트 부터)로 저장)
  • 네트워크 바이트 순서 : 포트번호나 IP 주소와 같은 정보를 바이트 단위로 네트워크로 전송하는 순서
    • High-Order(= Big Endian)

 

ntoh, hton

  • htons(), htonl() (컴퓨터 내부 > 네트워크)
  • ntohs(), ntohl() (네트워크로부터 수신한 숫자)

s = unsigned short integer 변환 (2 bytes)

l = unsigned long integer 변환 (4 bytes)

 


 

바이트 순서 확인 예

함수 : getservbyname()

// 사용법

pmyservent = getservbyname("echo", udo");

 

위 코드는 UDP를 사용하는 echo 서비스의 포트번호를 알아내기 위한 코드입니다.

getservbyname()은 servent라는 구조체의 포인터를 리턴하는데 servent 구조체의 정의는 아래와 같습니다. (netdb.h 헤더 파일에 정의되어 있음)

struct servent {
    char *s_name;	// 서비스 이름
    char **s_aliases;	// 별명 목록
    char s_port;	// 포트번호
    char *s_proto;	// 사용하는 프로토콜
}

 

사용 예제

//----------------------------------
// 파일명	: byte_order.c
// 기 능	: 호스트 바이트 순서 테스트 프로그램
// 컴파일	: gcc byte_order.c -o byte_order
// 사용법	: ./byte_order
//----------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int main(void) {
    struct servent *servent;
    servent = getservbyname("echo", "udp");
    if(servent == NULL) {
        printf("서비스 정보를 얻을 수 없습니다.");
        exit(0);
    }

    printf("UDP 에코 포트번호 (네트워크 순서) : %d\n", servent->s_port);
    printf("UDP 에코 포트번호 (호스트 순서) : %d\n", ntohs(servent->s_port));

    return 0;
}

 

실행 결과

<Big Endian>
UDP 에코 포트번호 (네트워크 순서) : 7
UDP 에코 포트번호 (호스트 순서) : 7

<Little Endia>
UDP 에코 포트번호 (네트워크 순서) : 1792
UDP 에코 포트번호 (호스트 순서) : 7

 

 

반응형