Unix域协议并不是一个实际的协议族,它只是在现一台主机上进行客户-服务通信时,使用与在不同主机上的客户和服务器间通信时相同的API的一种方法 ,当客户和服务器在同一台主机上时,Unix域协议 是IPC通信方式的一个替代品
使用Unix域套接口有三个原因:
1、当通信双方在同一台主机上时,Unix域套接口的速度通常是TCP套接口的两倍
2、Unix域套接口可以用来在同一台主机上的各进程之间传递描述字
3、Unix域套接口的较新实现中可以向服务器提供客户的凭证,这能提供附加的安全检查
Unix域套接口地址结构定义在<sys/un.h>头文件中,其结构定义如下:
struct sockaddr_un { uint8_t sun_len; sa_family_t sun_family;//AF_LOCAL char sun_path[104]; //null-terminated pathname };
#include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char **argv) { int sockfd; socklen_t len; struct sockaddr_un addr1, addr2; if (argc != 2) { printf("usage: unixbind <pathname>\n"); return -1; } 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); if (bind(sockfd, (struct sockaddr*)&addr1, SUN_LEN(&addr1)) < 0) { printf("bind error:%s\n", strerror(errno)); return -1; } len = sizeof(addr2); if (getsockname(sockfd, (struct sockaddr*)&addr2, &len) < 0) { printf("getsockname error:%s\n", strerror(errno)); close(sockfd); return -1; } printf("bound name=%s, returned len=%d\n", addr2.sun_path, len); exit(0); return 0; }