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
- 下層のパケットインターフェース
#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
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関数のパラメータの組合せは限られていると思うので,並べとく.ついでにアドレスを指定するための構造体も書いておく.
こんなけあれば,大抵の事足るのではないだろうか.
| プロトコル | domain | type | protocol | address |
|---|---|---|---|---|
| TCP/IP | PF_INET | SOCK_STREAM | 0 | sockaddr_in,in_addr |
| UDP/IP | SOCK_DGRAM | 0 | ||
| IP | SOCK_RAW | ? | ||
| ローカル通信 | PF_UNIX,PF_LOCAL | SOCK_STREAM | 0 | sockaddr_un |

