位元組順序
請務必小心考慮主機架構用來儲存整數的位元組順序,以及個別傳輸通訊協定在連線上使用的位元組順序之間的任何差異。 傳遞至 Windows Sockets 常式或從 Windows Sockets 常式傳送的位址或埠號碼的任何參考,都必須依網路順序 (大端) 來使用通訊協定。 在 IP 的情況下,這包括 sockaddr 結構的 IP 位址和埠參數 (,但不包括 sin_family參數) 。
許多 UNIX 系統會在以網路位元組順序表示整數的 CPU 上運作, (大端) 。 因此,不需要將整數從主機位元組順序轉換為網路位元組順序,而不會造成問題,即使不建議進行可攜性也一樣。
相反地,大部分 Intel® CPU 用來表示整數的位元組順序是小到大。 因此,在 Winsock Sockets 函式和結構中使用之前,整數必須從主機位元組順序轉換成網路位元組順序。
請考慮通常會連絡對應至時間服務之 TCP 埠上的伺服器的應用程式,但會提供一種機制,讓使用者指定替代埠。 getservbyname所傳回的埠號碼已經依網路順序,這是建構位址所需的格式,因此不需要轉譯。 不過,如果使用者選擇使用不同的埠,輸入為整數,則應用程式必須在使用 htons 或 WSAHtons 函式建構位址之前,先將它從主機轉換成 TCP/IP 網路順序 () 。 相反地,如果應用程式要在 getpeername 傳回的位址內顯示埠數目 (,例如) ,則必須使用 ntohs 或 WSANtohs 函式將埠號碼從網路轉換成主機順序) (,才能顯示埠號碼。
因為 Intel 和網際網路位元組順序不同,所以上述的轉換是無法避免的。 請注意,應用程式寫入器應該使用作為 Winsock 一部分提供的標準轉換函式,而不是撰寫自己的轉換程式碼,因為未來 Winsock 的實作可能會執行于主機順序與網路位元組順序相同的系統上。 只有使用主機和網路位元組順序之間標準轉換函式的應用程式可能會是可攜式的。
相關主題