Unix 소켓-네트워크 바이트 순서
불행히도 모든 컴퓨터가 동일한 순서로 멀티 바이트 값을 구성하는 바이트를 저장하는 것은 아닙니다. 2 바이트로 구성된 16 비트 인터넷을 고려하십시오. 이 값을 저장하는 방법에는 두 가지가 있습니다.
Little Endian −이 방식에서 하위 바이트는 시작 주소 (A)에 저장되고 상위 바이트는 다음 주소 (A + 1)에 저장됩니다.
Big Endian −이 방식에서 상위 바이트는 시작 주소 (A)에 저장되고 하위 바이트는 다음 주소 (A + 1)에 저장됩니다.
서로 다른 바이트 순서 규칙을 가진 컴퓨터가 서로 통신 할 수 있도록 인터넷 프로토콜은 네트워크를 통해 전송되는 데이터에 대해 표준 바이트 순서 규칙을 지정합니다. 이를 네트워크 바이트 순서라고합니다.
인터넷 소켓 연결을 설정하는 동안 sockaddr_in 구조의 sin_port 및 sin_addr 멤버에있는 데이터가 네트워크 바이트 순서로 표시되는지 확인해야합니다.
바이트 순서 함수
호스트의 내부 표현과 네트워크 바이트 순서 사이에서 데이터를 변환하는 루틴은 다음과 같습니다.
함수 | 기술 |
---|---|
htons () | 호스트 간 짧은 |
htonl () | 긴 네트워크에 호스트 |
ntohl () | 긴 호스트 네트워크 |
ntohs () | 호스트 간 네트워크 단락 |
아래에 이러한 기능에 대한 자세한 내용이 나열되어 있습니다.
unsigned short htons(unsigned short hostshort) −이 함수는 16 비트 (2 바이트) 수량을 호스트 바이트 순서에서 네트워크 바이트 순서로 변환합니다.
unsigned long htonl(unsigned long hostlong) −이 기능은 32 비트 (4 바이트) 수량을 호스트 바이트 순서에서 네트워크 바이트 순서로 변환합니다.
unsigned short ntohs(unsigned short netshort) −이 기능은 16 비트 (2 바이트) 수량을 네트워크 바이트 순서에서 호스트 바이트 순서로 변환합니다.
unsigned long ntohl(unsigned long netlong) −이 기능은 네트워크 바이트 순서에서 호스트 바이트 순서로 32 비트 수량을 변환합니다.
이러한 함수는 매크로이며 결과적으로 호출 프로그램에 변환 소스 코드가 삽입됩니다. 리틀 엔디안 머신에서 코드는 네트워크 바이트 순서로 값을 변경합니다. big-endian 머신에서는 코드가 필요하지 않으므로 삽입되지 않습니다. 함수는 널로 정의됩니다.
호스트 바이트 순서를 결정하는 프로그램
다음 코드를 byteorder.c 파일에 보관 한 다음 컴파일하고 컴퓨터에서 실행합니다.
이 예에서는 2 바이트 값 0x0102를 짧은 정수에 저장 한 다음 2 개의 연속 바이트 인 c [0] (주소 A) 및 c [1] (주소 A + 1)을 확인하여 바이트를 결정합니다. 주문.
#include <stdio.h>
int main(int argc, char **argv) {
union {
short s;
char c[sizeof(short)];
}un;
un.s = 0x0102;
if (sizeof(short) == 2) {
if (un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
}
else {
printf("sizeof(short) = %d\n", sizeof(short));
}
exit(0);
}
Pentium 시스템에서이 프로그램에 의해 생성 된 출력은 다음과 같습니다.
$> gcc byteorder.c
$> ./a.out
little-endian
$>