반응형
바이트 순서(byte order)
- 호스트 바이트 순서 : 컴퓨터가 내부 메모리에 숫자를 저장하는 순서
- CPU의 종류에 따라 다름
- Little Endian : 80x86 계열의 CPU (ex. 50146 > 0xC3E2 : E2, C3순서(하위 바이트 부터)로 저장)
- Big Endian : MC68000 계열의 CPU (ex. 50146 > 0xC3E2 : C3, E2순서(상위 바이트 부터)로 저장)
- CPU의 종류에 따라 다름
- 네트워크 바이트 순서 : 포트번호나 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
반응형