728x90
반응형
SMALL
바이트 정렬
▶메모리에 데이터를 저장할 때 바이트의 배치 순서
- 빅 엔디언 (Big-endian) : 최상위 바이트 (MSB, Most Significant Byte)부터 차례로 저장
- 리틀 엔디언 (Little-endian) : 최하위 바이트 (LSB, Least Significant Byte)부터 차례로 저장
*시스템에서 사용하는 바이트 정렬은 CPU와 운영체제에 따라 다르므로 이기종 간의 데이터를 교환할 때는 고려 해야함
바이트 정렬 방식을 고려해야 하는 이유
바이트 정렬 방식을 고려해야 하는 경우
1. 네트워크 프로토콜 구현을 위해 필요한 정보
(a) IP 주소 → 빅 엔디언
(b) 포트 번호 → 빅엔디언
빅엔디언 = 네트워크 바이트 정렬
2. 응용 프로그램이 주고 받는 데이터
(c) 빅 엔디언 또는 리틀 엔디언으로 통일
서버 - 클라이언트 모두 개발 시 하나로 통일
클라이언트 개발 시 서버의 사양을 따름
바이트 정렬 함수 사용 상황
▶hton*() 함수는 응용 프로그램이 소켓 함수에 데이터를 넘겨주기 전에 호출
▶nton*() 함수는 소켓 함수가 결과로 리턴한 데이터를 응용 프로그램이 출력 등의 목적으로 사용하기 전에 호출
sockaddr_in / sockaddr_in6 구조체의 바이트 정렬 방식
바이트 정렬 함수 실습
#include "../../common.h"
int main(int argc, char* argv[])
{
//원속 초기화
WSADATA wsa;
if(0 != WSAStartup(MAKEWORD(2, 2), &wsa) )
return 1;
u_short x1 = 0x1234; //short 2byte
u_long y1 = 0x1234567; //long 4byte
u_short x2; //바뀐 값을 넣을 변수
u_long y2; //바뀐 값을 넣을 변수
//호스트 바이트 -> 네트워크 바이트
printf("[호스트 바이트 -> 네트워크 바이트]\n");
printf("%#x -> %#x\n", x1, x2 = htons(x1));
printf("%#x -> %#x\n", y1, y2 = htonl(y1));
// 네트워크 바이트 -> 호스트 바이트
printf("\n[네트워크 바이트 -> 호스트 바이트]\n");
printf("%#x -> %#x\n", x2, ntohs(x2)); //hton 함수에 short인 s를 붙인 htons 함수
printf("%#x -> %#x\n", y2, ntohl(y2)); //hton 함수에 long인 l을 붙인 htonl 함수
// 잘못된 사용 예
printf("\n[잘못된 사용 예]\n");
printf("%#x -> %#x\n", x1, htonl(x1)); //short를 htonl로 찍으면 빈 byte가 0으로 자릿수 채워짐
printf("%#x -> %#x\n", y1, htons(y1)); //long을 htons로 찍으면 byte가 짤림
// 윈속 종료
WSACleanup();
return 0;
}
728x90
반응형
LIST
'코딩 > Network' 카테고리의 다른 글
[네트워크] DNS와 도메인, IP 주소 변환 함수 (0) | 2023.04.15 |
---|---|
[네트워크] IP 주소 변환 함수 (0) | 2023.04.14 |
[네트워크] 소켓 주소 구조체 (0) | 2023.04.14 |
[네트워크] 소켓 생성과 닫기 (0) | 2023.04.14 |
[네트워크] 윈속 초기화와 종료 (0) | 2023.04.14 |