Unix域协议并不是一个实际的协议族,它只是在同一台主机上进行客户-服务器通信时,使用与在不同主机上的客户和服务器间通信时相同的API的一种方法。
当客户和服务器在同一台主机上时,Unix域协议是这套系列书的第二卷将介绍的IPC通信方式的一种替代品。
Unix域提供了两种类型的套接口:字节流套接口(与TCP类似)、数据报套接口(与UDP类似)
使用Unix域套接口有三个原因:
- 当通信双方位于同一台主机上时,Unix域套接口的速度通常是TCP套接口的两倍。
- Unix域套接口可以用来在同一台主机上的各进程之间传递描述字。
- Unix域套接口的较新实现中可以向服务器提供客户的凭证,这能提供附加的安全检查。
二、Unix域套接口地址结构
struct sockaddr_un{ uint8_t sun_len; sa_family_t sun_family; /* AF_LOCAL */ char sun_path[104]; /* null-terminated pathname */ };
三、socketpair函数
socketpair函数建立一对相互连接的套接口,这个函数只对Unix域套接口适用
#include <sys/socket.h> int socketpair(int family, int type, int protocol, int sockfd[2]); 返回:成功0,出错-1
family:必须为AF_LOCAL
protocol:必须为0
type:可以是SOCK_STREAM或SOCK_DGRAM
新创建的两个套接口描述字作为sockfd[0]和sockfd[1]返回
socketpair的多进程例子
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <pthread.h> 5 6 #define SOCKET_BUFFER_SIZE (32768U) 7 8 void *thread_function(void *arg) 9 { 10 int len = 0; 11 int fd = *((int *)(arg)); 12 char buf[500]; 13 int cnt = 0; 14 15 while(1) { 16 len = sprintf(buf, "Hi, main process, cnt = %d", cnt++); 17 write(fd, buf, len); 18 19 len = read(fd, buf, 500); 20 buf[len] = '