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;
}