プログラムテクニックメモ(2001/07/12)
ソケットの名前の由来は、みなさんの家でお使いの電源コンセント (=) の形ありますよね。これなんですよ知ってました? って本筋の話でなかったですね。けど、このソケットって言うのは、マシン同士でつなげると意味もあるんですよ、本当よホント!。
で今や当たり前の様にホームページを見たりメールが使えますが、これはインターネットという膨大に繋がったマシン同士で、ソケット=TCP/IP,UDPという通信レイヤの規格でお互いのマシンを繋げてお話(プロトコル)をした結果が表示されるだけの物なのです。
2bytes以上のバイト幅を持つ値をコンピュータ内のメモリに格納するときや、データとして転送するときの方法(エンディアンともいう)です。バイトオーダーは、CPUのアーキテクチャによって決まっていて、Intel系のプロセッサはリトルエンディアン(データの上位下位が逆転)、Motorola系のプロセッサはビッグエンディアン(データの上位下位がそのまま)という手法で使用されている。この異なったプロセッサ同士でやりとりする場合は、かならずビッグエンディアンに変換してからやりとりします。
Cygwinは、もちろんIntel系のプロセッサなのでリトルエンディアンです。
下記のサンプルを実行してみるとスグにわかります。ビッグエンディアンでは "25"と表示され、 リトルエンディアンでは "6400"と表示されます。リトルエンディアンでは、 ntohs(serv->s_port) と変換しなければいけません。
struct servent *serv;
serv = getservbyname("smtp", "tcp");
if ( serv == NULL )
printf("error\n");
else {
printf("ok\n");
printf("port = %d\n", serv->s_port);
}
リトルエンディアンは、上位と下位の8ビットを反転させる方式を使用しているので、それを正しい値として変換するには、バイトオーダ変換関数を使用します。
バイトオーダ変換 備考 htol 4バイト整数をWindow形式(リトルエンディアン)からネットワークバイトオーダー形式(ビッグエンディアン)に変換 htos 2バイト整数をWindow形式からネットワークバイトオーダー形式に変換 htohl 4バイト整数をネットワークバイトオーダー形式からWindow形式に変換 htohs 2バイト整数をネットワークバイトオーダー形式からWindow形式に変換