Unix/Linuxドメインプロトコルは、異なるホスト間でのクライアント-サーバと同じAPIを利用して、
同一ホスト内でのクライアント-サーバ間通信を行うためのメカニズム
そのため、サーバプロセスでは、ポートの代わりに、指定されたファイルパスをバインドし、
ファイルを通じてクライアントとデータの送受信を実現する。
今回は、指定したパスをバインドし、バインドされたファイルをlsコマンドで確認してみる。
Unixドメインソケットのバインド
#include "unp.h"
int
main(int argc, char **argv)
{
int sockfd;
socklen_t len;
struct sockaddr_un addr1, addr2;
if (argc != 2)
err_quit("usage: unixbind <pathname>");
sockfd = Socket(AF_LOCAL, SOCK_STREAM, 0);
unlink(argv[1]);
bzero(&addr1, sizeof(addr1));
addr1.sun_family = AF_LOCAL;
strncpy(addr1.sun_path, argv[1], sizeof(addr1.sun_path)-1);
Bind(sockfd, (SA *) &addr1, SUN_LEN(&addr1));
len = sizeof(addr2);
Getsockname(sockfd, (SA *) &addr2, &len);
printf("bound name = %s, returned len = %d\n", addr2.sun_path, len);
exit(0);
}
実行環境
Mac OS X Lion
gcc version:i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00)
実行結果
ファイルマスクを調べる
$ umask
0022
バインドファイルパス(./domainsock)を指定し、バインド実施
$ ./unixbind ./domainsock
bound name = ./domainsock, returned len = 14
-Fオプションを付与して、ファイル名にファイルタイプを付与して表示する。ソケットには、通常(=)が付く。
$ ls -lF ./domainsock
srwxr-xr-x 1 miyamotoyukitake staff 0 Sep 22 15:48 ./domainsock=
ドメインソケットでは、こうして作成したバインド済みファイルを介して、データのやりとりを
ソケット通信APIを利用して行う。