#include <stdio.h>
#include <netinet/in.h>
typedef union {
short sVal;
char cVal[2];
} TWO_BYTE_t;
int main(void)
{
TWO_BYTE_t data;
data.sVal = 0x1234;
if(data.cVal[0] == 0x34 && data.cVal[1] == 0x12)
printf("Little Endian System.\n");
else
printf("Big Endian System.\n");
in_port_t portNumber = 0x1234;
in_addr_t ipAddress = 0x12345678;
printf("Port Number HBO: %#04x, NBO: %#04x\n", portNumber, htons(portNumber));
printf("IP Address HBO: %#08x, NBO: %#08x\n", ipAddress, htonl(ipAddress));
printf("sizeof(short): %zu bytes\n", sizeof(short));
printf("sizeof(int): %zu bytes\n", sizeof(int));
printf("sizeof(long): %zu bytes\n", sizeof(long));
printf("sizeof(long long): %zu bytes\n", sizeof(long long));
return 0;
}
엔디안 검사와 네트워크 바이트 순서 변환을 확인하는 코드입니다.
먼저 헤더파일 및 union 선언부터 살펴보겠습니다.
Union을 이용해 하나의 메모리 공간을 sVal과 cVal이라는 데이터형으로 해석할 수 있도록 선언했습니다. Short->2바이트 char[2] 즉 2바이트 공간이 될 것입니다.
앞서 선언한 TWO_BYTE_t 유니온을 선언한 후, sVal에 16진수 0x1234를 저장합니다\
만약 실행한 하드웨어가 리틀앤디안일 경우 배열의 첫 주소에 34, 다음에 12가 저장될것입니다. 빅 앤디안일경우 배열의 첫 주소에 12 다음주소에 34가 저장될 것입니다.
In_port_t 와 in_addr_t를 사용하여 포트번호와 ip주소를 설정합니다. 그 후 호스트(나)의 시스템에서 사용하는 형식 , 네트워크 시스템에서 사용하는 형식으로 출력합니다 전자는 시스템에 따라 다를것이고, 후자는 빅 앤디안 형식으로 출력될 것입니다.
시스템에서 사용하는 자료형의 크기를 출력합니다. 살펴볼점은 long의 사이즈는 시스템에 따라 다를 수 있다는 것입니다(word의 크기가 예전에는 int였지만 현재는 long임)
실행결과 본인의 시스템은 리틀 앤디안이며, 그에 따라 빅앤디안 시스템인 네트워크 바이트의 결과와 차이를 보입니다.
'프로그래밍 > 2024 네트워크 프로그래밍' 카테고리의 다른 글
6. Address conversion (0) | 2025.01.06 |
---|---|
5. inet_addr 살펴보기 (0) | 2025.01.06 |
3. c에서의 파일복사 (0) | 2025.01.03 |
2. 파일 디스크립터에서 파일 열기/읽기/쓰기/닫기 (1) | 2025.01.03 |
1. 기초 소켓 통신 살펴보기 (0) | 2025.01.03 |