ntohl 예제

ntohl은 BSD 소켓을 구현하는 대부분의 UNIX 시스템을 포함한 다른 환경에 이식가능합니다. ntohl 매크로는 헤더 파일에 정의되어 있습니다. 예를 들어 다음 코드 스니펫은 두 배의 데이터 배열을 한 형식(예: Big-Endian)에서 다른 형식(예: 리틀 엔디안)으로 변환하는 방법을 보여 줍니다. 엔디안 형식을 결정합니다. 예를 들어 TCP/IP 스택을 실행하는 프로세서가 자체적인 Big-Endian인 경우 네 개의 매크로(예: ntohs, ntohl, htons, htonl)는 아무 작업도 수행하지 않고 런타임 성능에 영향을 미치지 않습니다. 그러나 프로세서가 리틀 엔디안인 경우 매크로는 바이트의 순서를 적절하게 다시 정렬합니다. 이러한 매크로는 네트워크 패킷을 빌드하고 구문 분석할 때와 소켓 연결이 생성될 때 정기적으로 호출됩니다. 리틀 엔디안 프로세서에서 TCP/IP를 사용할 때 심각한 런타임 성능 저하가 발생합니다. 따라서 네트워크 기능이 풍부한 라우터 나 게이트웨이와 같은 장치에서 사용할 Little-Endian 프로세서를 선택하는 것이 현명하지 않을 수 있습니다. (참조에서 발췌 [1]). 또한 표준 바이트 순서 API를 사용하여 런타임에 시스템의 바이트 순서를 결정할 수도 있습니다. 예를 들어 32비트 번호인 0xDEADBEEF를 예로 들어 보겠습니다.

빅 엔디안 협약에 따라 컴퓨터는 다음과 같이 저장합니다: uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl (uint32_t 네트롱); uint16_t ntohs(uint16_t 네트쇼트); 호스트-네트워크 API의 또 다른 문제는 64비트 데이터 요소를 조작할 수 없다는 것입니다. 그러나 고유한 ntohll() 및 htonll() 해당 함수를 작성할 수 있습니다: ntohl 매크로는 네트워크 바이트 순서에서 바이트 순서를 호스트하는 서명되지 않은 긴 정수 netlong을 변환합니다. IBM370에서는 네트워크 바이트 주문과 마찬가지로 IBM 370 바이트 주문이 큰 엔디안이기 때문에 null 매크로입니다. 마찬가지로 들어오는 32비트 값을 변환하려면 ntohl()을 사용합니다. ntohl 매크로가 항상 사용되도록 적절한 헤더 파일을 포함해야 합니다. 다른 형식이 필요한 경우 다중 바이트 수를 되돌리는 것은 매우 쉽습니다. 다음 예제에서는 간단한 C 공용 구조체를 사용하여 Endian 변환 함수를 구현하는 방법을 보여 주습니다. 마지막으로, 자동 크기 감지를 통해 모든 원자 데이터 유형(예: int, float, double 등)을 처리할 수 있는 보다 일반적인 함수를 작성할 수 있습니다. 이미 네트워크 바이트 순서에 있습니다. 그러나 누군가가 인텔 컴퓨터에서 빌드하고 제대로 작동하도록 할 수 있으므로 항상 코드에서 사용해야 합니다.

실제로 대부분의 경우 TCP/IP에 대해 정의된 winsock2.h에 선언된 소켓 함수 집합(표 I 참조)이 있으므로 위의 함수를 구현할 필요가 없으므로 TCP/IP 네트워킹을 지원하는 모든 컴퓨터를 사용할 수 있습니다. 표준 및 endianness 독립적인 `네트워크 바이트 순서`로 데이터를 저장합니다. . 어쨌든 이러한 함수가 작동하는 방식은 먼저 호스트(컴퓨터의) 바이트 순서또는 네트워크 바이트 순서로 변환할지 여부를 결정하는 것입니다. “host”인 경우 호출할 함수의 첫 글자중 “h”입니다. 그렇지 않으면 “네트워크”에 대한 “n”입니다. 함수 이름의 중간은 한 “에서”로 변환하기 때문에 항상 “to”이고 끝에서 두 번째 문자는 변환하는 내용을 보여 주므로 항상 “받는 사람”입니다.

カテゴリー: 未分類 パーマリンク