プログラムテクニックメモ(2001/07/12) 
 

ソケットとは

ソケットの名前の由来は、みなさんの家でお使いの電源コンセント (=) の形ありますよね。これなんですよ知ってました?  って本筋の話でなかったですね。けど、このソケットって言うのは、マシン同士でつなげると意味もあるんですよ、本当よホント!。

で今や当たり前の様にホームページを見たりメールが使えますが、これはインターネットという膨大に繋がったマシン同士で、ソケット=TCP/IP,UDPという通信レイヤの規格でお互いのマシンを繋げてお話(プロトコル)をした結果が表示されるだけの物なのです。

バイトオーダとは

2bytes以上のバイト幅を持つ値をコンピュータ内のメモリに格納するときや、データとして転送するときの方法(エンディアンともいう)です。バイトオーダーは、CPUのアーキテクチャによって決まっていて、Intel系のプロセッサはリトルエンディアン(データの上位下位が逆転)、Motorola系のプロセッサはビッグエンディアン(データの上位下位がそのまま)という手法で使用されている。この異なったプロセッサ同士でやりとりする場合は、かならずビッグエンディアンに変換してからやりとりします。

Cygwinは?

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形式に変換

リンク

WinSock32に関する基本的な話と関数の紹介

バイトオーダとは

chatプログラムを作る?

←topへ