UNIX域协议是在单个主机上执行客户/服务器通信的一种方法
使用UNIX域套接字有以下3个理由:
1.UNIX域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍
2.UNIX域套接字可用于在同一个主机上的不同进程之间传递描述符
3.UNIX域套接字较新的实现把客户的凭证提供给服务器,从而能够提供额外的安全检查措施
UNIX域中用于标识客户和服务器的协议地址是普通文件系统的路径名。这些路径名不是普通的UNIX文件:
除非他们和UNIX域套接字关联起来,否则无法读写这些文件。
可以查看之前apue的学习笔记 http://www.cnblogs.com/runnyu/p/4650843.html
UNIX域套接字的地址结构
struct sockaddr_un { sa_family_t sun_family; /* AF_LOCAL */ char sun_path[104]; /* pathname */ };
实现提供了SUN_LEN宏以一个指向sockaddr_un结构的指针作为参数并返回该结构的长度
UNIX域套接字的bind调用
下面程序创建一个UNIX域套接字,往其上bind一个路径名,再调用getsockname输出这个绑定的路径名
1 #include "unp.h" 2 3 int 4 main(int argc, char **argv) 5 { 6 int sockfd; 7 socklen_t len; 8 struct sockaddr_un addr1, addr2; 9 10 if (argc != 2) 11 err_quit("usage: unixbind <pathname>"); 12 13 sockfd = Socket(AF_LOCAL, SOCK_STREAM, 0); 14 15 unlink(argv[1]); /* OK if this fails */ 16 17 bzero(&addr1, sizeof(addr1)); 18 addr1.sun_family = AF_LOCAL; 19 strncpy(addr1.sun_path, argv[1], sizeof(addr1.sun_path)-1); 20 Bind(sockfd, (SA *) &addr1, SUN_LEN(&addr1)); 21 22 len = sizeof(addr2); 23 Getsockname(sockfd, (SA *) &addr2, &len); 24 printf("bound name = %s, returned len = %d\n", addr2.sun_path, len); 25 26 exit(0); 27 }