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