linux和UNIX都拥有一个非常实用的工具--UNIX套接字,或称为本地套接字,它可以被用在进程间通讯(IPC)当中。UNIX套接字的运转机制和Internet套接字类似,主要的区别UNIX套接字只能用在一台计算机中,而Internet套接字则可以在不同的计算机之间使用。UNIX套接字定址的方式是作为本地文件系统里的一个文件。
你可能会奇怪为什么要使用UNIX套接字而不使用常规的Internet套接字呢?或许最大的原因就是安全和速度了。无论何时,当你打开任何Internet套接字的时候,你可能就帮远程的黑客打开了入侵之门。
打开UNIX套接字和打开Internet套接字的方法大同小异。你应该使用套接字命令,不过这里你不应该传递PF_INET,而应该传递PF_LOCAL。下面是一个例子:
int fd = -1;
fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
事实上,PF_LOCAL 有很多别名,你可以在套接字命令的页面查找它们。本地套接字的正确通讯类型是SOCK_STREAM和SOCK_DGRAM。本地套接字只支持默认的协议。
套接字命令仅仅创建套接字。要使用它,你必须用约束命令给它约束一个名称。对于本地套接字来说,这个名称就是文件名。对于Internet套接字,约束命令的第2个参数是指向sockaddr_in的指针,而对于本地套接字,这个参数应该是sockaddr_un。sockaddr_un命令有两个成员:sun_family和sun_path。sun_family永远是AF_LOCAL.,而sun_path成员则是本地文件的路径。按照管理,这个文件包含在tmp目录下。因此约束套接字的代码如下所示:
int fd = -1;
int rslt = -1;
int sz = 0;
const char path[] = "/tmp/testsocket";
struct sockaddr_un server;
server.sun_family = AF_LOCAL;
strncpy(server.sun_path, path, strlen(path));
sz = SUN_LEN(server);
fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
rslt = bind(fd, (struct sockaddr*)&server, sz);
if (rslt < 0){
/*error handling code*/
}
SUN_LEN宏是一个非常不错的,用来计算sockaddr_un结构大小的捷径。
一旦套接字被打开并约束,你就可以把它当描述符来使用。你可以把本地套接字视为使用同样协议的Internet套接字。因此你可以使用标准通讯协议或是自行设计。当客户端处于同一计算机的时候,客户端可以连接到这些套接字。你同样可以使用本地套接字的异步命令。