ソケットを介してあるプロセスから別のプロセスに整数変数を送信し、受信側で値を出力すると、値は ntohl/htonl を使用しなくても同じです。ソケット構造を初期化する以外に、これらの関数をどこで使用する必要がありますか。リトル/ビッグエンディアンを理解しています。しかし、値が同じままであるのに、なぜポート番号と IP 番号をホスト/ネットワークのバイト順に変換する必要があるのでしょうか。整数がネットワーク経由で転送される方法を詳しく説明してください。
3 に答える
プログラムを移植可能にしたい場合は、サイズが 1 バイトを超える整数をネットワーク経由で送信するときはいつでも、最初にhtons
またはを使用してそれをネットワーク バイト オーダーに変換htonl
する必要があり、受信側のコンピューターは を使用してそれをホスト バイト オーダーに変換する必要があります。ntohs
またはntohl
。
あなたの場合、値がまだ同じである理由は、おそらく送信側コンピューターと受信側コンピューターのエンディアンが同じであるためです。つまり、使用している送信側コンピューターと受信側コンピューターはどちらもリトル エンディアン (またはビッグ エンディアン) です。
しかし、プログラムを移植可能にしたい場合、これが常に当てはまるとは限りません。たとえば、ある日、送信側のコンピューターが Intel x86 で、受信側のコンピューターが Sun SPARC である可能性がありますhtons
。
x86 または amd64 マシンから PowerPC プロセッサを搭載したマシンにデータをバイナリ形式で送信する場合、異なるプロセッサが整数を異なる方法で処理し、整数をスワップするように見えるため、データに「NUXI 問題」が発生することがすぐにわかります。バイト。(実際にバイトを交換するわけではありません。異なる順序で処理するだけです。)
x86 または amd64 で作業する場合、最下位バイトがメモリ内で最初に来ます (このようにして、下位メモリ アドレスから上位メモリ アドレスへの加算を実行できます)。PowerPC は最上位バイトを最初にメモリに配置します (この方法では、メモリ内の前にあるバイトに基づいて数値をソートできます。文字列のソートと整数のソートはまったく同じにすることができます)。
アーキテクチャではネットワークの順序がネイティブの順序と同じであるため、同じままです。コードを別のアーキテクチャ用にコンパイルする予定がない場合は、hton/ntoh 呼び出しを省略できます。あなたのコードは移植性がありません。