バイトの順序付け
ホスト アーキテクチャによる整数の格納に使用されるバイト順序と、個々のトランスポート プロトコルによってワイヤで使用されるバイト順序の違いを考慮に入れる必要があります。 Windows ソケット ルーチン間で渡されるアドレスまたはポート番号への参照は、使用されるプロトコルのネットワーク順序 (ビッグ エンディアン) である必要があります。 IP の場合、これには sockaddr 構造体の IP アドレスとポート パラメーターが含まれます ( ただし、sin_family パラメーターは含まれません)。
UNIX システムの多くが、ネットワーク のバイト順 (ビッグ エンディアン) の整数を表す CPU で動作します。 そのため、整数をホストのバイト順からネットワークのバイト順に変換する必要は無視でき、移植性に問題が生じなくても問題が発生する可能性があります。
これに対し、ほとんどの Intel® CPU で整数を表すために使用されるバイト順序は、リトル エンディアンです。 そのため、Winsock Sockets の関数と構造体で使用する前に、整数をホストのバイトオーダーからネットワークのバイト順に変換することが必須になります。
通常、タイム サービスに対応する TCP ポート上のサーバーに接続するが、ユーザーが代替ポートを指定するメカニズムを提供するアプリケーションを考えてみましょう。 getservbyname によって返されるポート番号は既にネットワーク順です。これは、変換が不要になるようにアドレスを作成するために必要な形式です。 ただし、ユーザーが整数として入力された別のポートを使用することを選択した場合、アプリケーションはアドレスを作成する前に、これをホストから TCP/IP ネットワークの順序 ( htons または WSAHtons 関数を使用) に変換する必要があります。 逆に、アプリケーションがアドレス内のポートの番号を表示する場合 ( getpeername で返されるなど)、ポート番号をネットワークからホスト順序に変換する必要があります ( ntohs 関数または WSANtohs 関数を使用)。
Intel とインターネットのバイトオーダーは異なるため、前述の変換は避けられません。 アプリケーション ライターは、Winsock の将来の実装は、ホストの順序がネットワークのバイト順と同じシステムで実行される可能性が高いため、Winsock の一部として提供される標準変換関数を使用する必要があります。 ホストとネットワークのバイト順の間で標準変換関数を使用するアプリケーションのみが移植可能である可能性があります。
関連トピック