ネットワークインタフェース

ローカル名のバインド

ソケットは、その作成時には名前がありません。遠隔プロセスは、ソケットにアドレスがバインドされるまでソケットを参照できません。通信プロセスは、アドレスを介して接続されます。UNIX ファミリでは、接続は、通常、1 つまたは 2 つのパス名からなります。UNIX ファミリのソケットは、必ずしも名前にバインドされる必要はありませんが、バインドされると、local pathname または foreign pathname といった順序セットを複製することができません。パス名では、既存のファイルを参照できません。

bind(3SOCKET) 呼び出しを使用すると、プロセスは、ソケットのローカルアドレスを指定できます。これによって、local pathname が決定します。一方、connect(3SOCKET)accept(3SOCKET) は、遠隔側アドレスを固定することでソケットの接続を完了します。bind(3SOCKET) は、次のように使用します。

bind (s, name, namelen);

s は、ソケットハンドルです。バインド名は、バイト文字列であり、サポートするプロトコル (複数も可) がこれを解釈します。UNIX ファミリ名には、パス名とファミリが含まれます。例では、UNIX ファミリソケットに /tmp/foo という名前をバインドしています。

#include <sys/un.h>
 ...
struct sockaddr_un addr;
 ...
strcpy(addr.sun_path, "/tmp/foo");
addr.sun_family = AF_UNIX;
bind (s, (struct sockaddr *) &addr,
		strlen(addr.sun_path) + sizeof (addr.sun_family));

AF_UNIX というソケットアドレスの大きさを判定する場合には、ヌル (null) バイトがカウントされません。このため、strlen(3C) の使用をお勧めします。

addr.sun_path で参照されるファイル名は、システムファイル名空間でソケットとして作成されます。呼び出し側は、addr.sun_path が作成されるディレクトリに書き込み許可を持っていなければなりません。このファイルは、不要になったら呼び出し側が削除しなければなりません。AF_UNIX ソケットは、unlink(1M) で削除できます。