호스트 아키텍처에서 정수 저장에 사용되는 바이트 순서와 개별 전송 프로토콜에 의해 유선에서 사용되는 바이트 순서 간의 차이점을 항상 고려해야 합니다. Windows 소켓 루틴에서 전달된 주소 또는 포트 번호에 대한 참조는 사용 중인 프로토콜에 대한 네트워크 순서(big-endian)에 있어야 합니다. IP의 경우 여기에는 sockaddr 구조체의 IP 주소 및 포트 매개 변수가 포함됩니다(sin_family 매개 변수는 아님).
다수의 UNIX 시스템은 정수를 네트워크 바이트 순서(big-endian)로 나타내는 CPU에서 작동합니다. 따라서 이식성을 위해 권장되지 않는 경우에도 문제를 일으키지 않고 정수를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환할 필요가 무시될 수 있습니다.
반면 대부분의 Intel® CPU에서 정수로 나타내는 데 사용되는 바이트 순서는 little-endian입니다. 따라서 Winsock Sockets 함수 및 구조에서 사용되기 전에 정수가 호스트 바이트 순서에서 네트워크 바이트 순서로 변환되어야 합니다.
일반적으로 시간 서비스에 해당하는 TCP 포트의 서버에 연결하지만 사용자가 대체 포트를 지정하는 메커니즘을 제공하는 애플리케이션을 고려합니다. getservbyname 반환된 포트 번호는 이미 네트워크 순서로 정렬되어 있으며 이는 번역이 필요하지 않도록 주소를 생성하는 데 필요한 형식입니다. 그러나 사용자가 정수로 입력한 다른 포트를 사용하도록 선택한 경우 애플리케이션은 주소를 생성하기 전에 호스트에서 TCP/IP 네트워크 순서(htons 또는 WSAHtons 함수 사용)로 변환해야 합니다. 반대로 애플리케이션이 주소 내의 포트 수를 표시하는 경우(예: getpeername반환됨) 포트 번호를 네트워크에서 호스트 순서로 변환해야 합니다(ntohs 사용하거나 WSANtohs함수를사용).
Intel 및 인터넷 바이트 주문은 다르므로 앞에서 설명한 변환은 피할 수 없습니다. 나중에 Winsock 구현이 호스트 순서가 네트워크 바이트 순서와 동일한 시스템에서 실행될 가능성이 높기 때문에 애플리케이션 작성자는 자체 변환 코드를 작성하지 않고 Winsock의 일부로 제공되는 표준 변환 함수를 사용해야 한다는 경고를 받습니다. 호스트와 네트워크 바이트 순서 간에 표준 변환 함수를 사용하는 애플리케이션만 이식 가능할 수 있습니다.
관련 항목