09
5月
2007

socket関数とプロトコル

まずsocket関数とプロトコルとアドレスについて記述しておく.
socket関数
ドメインとタイプとプロトコル
アドレスの表現
よく使うSocket

socket関数

同一マシンのプロセス間だけでなく,別マシンのプロセスとも通信したりするには,Socketを使用する.で,そのためにsocketシステムコールを使用する.
int socket(int domain, int type, int protocol);
この関数の呼び出しが成功するとソケットへのディスクリプタを返す.これはファイルディスクリプタと同様に扱える.引数にprotocolというのがある.これを見ると,TCP/IPだのUDPだのを指定するのかと思うのは私だけだろうか.実際はちょっと違う.例えばTCP/IPで通信したければ,socketを以下のように呼び出す.
socket_df = socket(AF_INET, SOCK_STREAM, 0);
雰囲気を掴めたところで(こんなんで掴めるのか?)パラメータを一つずつ見ていく.

ドメインとタイプとプロトコル

socket関数の三つの引数は,どうやって通信するかを指定するものらしく,どのプロトコルファミリーのどのタイプのどのプロトコルを使用するかを選ぶ.man socketによるとdomainはどのプロトコルファミリーを使用するかを指定するらしく,以下の選択肢がある.
PF_UNIX,PF_LOCAL
ローカル通信
PF_INET
IPv4 インターネット・プロトコル
PF_INET6
IPv6 インターネット・プロトコル
PF_IPX
IPX - Novell プロトコル
PF_NETLINK
カーネル・ユーザ・デバイス
PF_X25
ITU-T X.25 / ISO-8208 プロトコル
PF_AX25
アマチュア無線 AX.25 プロトコル
PF_ATMPVC
生の ATM PVC にアクセスする
PF_APPLETALK
アップルトーク
PF_PACKET
下層のパケットインターフェース
なんだかPF_*****となっている.が,ネットで調査していてよく見掛けるのはAF_*****である.どういうことかというと,/usr/include/bits/socket.hによると
#define AF_UNIX         PF_UNIX
#define AF_FILE         PF_FILE
#define AF_INET         PF_INET
#define AF_AX25         PF_AX25
#define AF_IPX          PF_IPX
....
らしい.同ファイルコメントによると,PFはProtocol Familyで,AFはAddress Familyらしい.なんだかよく分からない.そしてtypeにはSocketの型(何?)を指定する.
SOCK_STREAM
SOCK_DGRAM
SOCK_SEQPACKET
SOCK_RAW
SOCK_RDM
で,PFによってはないtypeがあるので注意する.特にTCP/IPならSOCK_STREAMで,UDPならSOCK_DGRAMである.そしてprotocolでは,PFの中のどのプロトコルを使用するかを指定する.0を指定するとデフォルトのものが使用される.

アドレスの表現

socket関数でプロトコルを指定できた.では,アドレスはどうだろうか.アドレスはドメインによって独自のアドレス形式があるらしい.例えば,PF_INETではアドレスを以下の構造体で指定する(man ipより).
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET / u_int16_t sin_port; / port in network byte order / struct in_addr sin_addr; / internet address */
};

/* Internet address. / struct in_addr { u_int32_t s_addr; / address in network byte order */
};
コメントのとおりsin_familyは常にAF_INETをセットするらしい.

よく使うSocket

なんだかウダウダ書いたが,よく使用するsocket関数のパラメータの組合せは限られていると思うので,並べとく.ついでにアドレスを指定するための構造体も書いておく.

プロトコルdomaintypeprotocoladdress
TCP/IPPF_INETSOCK_STREAM0sockaddr_in,in_addr
UDP/IPSOCK_DGRAM0
IPSOCK_RAW?
ローカル通信PF_UNIX,PF_LOCALSOCK_STREAM0sockaddr_un

こんなけあれば,大抵の事足るのではないだろうか.

You may also like...