ファイヤープロジェクト
socket関数とプロトコル
2003-07-20T15:13+09:00   matsu
まず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関数のパラメータの組合せは限られていると思うので,並べとく.ついでにアドレスを指定するための構造体も書いておく.
プロトコルdomaintypeprotocoladdress
TCP/IPPF_INETSOCK_STREAM0sockaddr_in,in_addr
UDP/IPSOCK_DGRAM0
IPSOCK_RAW?
ローカル通信PF_UNIX,PF_LOCALSOCK_STREAM0sockaddr_un
こんなけあれば,大抵の事足るのではないだろうか.
matsu(C)
Since 2002
Mail to matsu