本章介绍一种高级IPC---UNIX域套接字机制,并说明它的应用方法
UNIX域套接字
UNIX域套接字用于在同一台计算机上运行的进程(无关进程)之间的(全双工)通信。相比于因特网套接字,UNIX域套接字效率更高。
UNIX域套接字仅仅复制数据,不执行协议处理,不需要添加或删除网络报头,无需计算校验和,不要产生顺序号,无需发送确认报文。
UNIX域套接字提供流和数据报两种接口,就像是套接字和管道的混合(双向的通信),使用socketpair函数创建一对无命名的、相互连接的UNIX域套接字
#include <sys/socket.h> int socketpair(int domain,int type,int protocol,int sockfd[2]);
也可以使用它们面向网络的域套接字接口(socket)建立该套接字。
一对相互连接的UNIX域套接字可以起到全双工管道的作用:两端对读和写开放。
命名UNIX域套接字
上一章学习了然后将一个地址绑定到一个因特网域套接字上。跟因特网域套接字一样,可以命名UNIX域套接字,并可将其用于告示服务。
UNIX域套接字的地址由sockaddr_un结构表示,在Linux 3.2.0和Solaris 10中定义如下
struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[UNIX_PATH_MAX]; /* pathname */ };
sun_path成员包含一个路径名。当我们将一个地址绑定到一个UNIX域套接字时,系统会用该路径名创建一个S_IFSOCK类型的文件。
该文件仅用于向用户进程告示套接字名字。该文件无法打开,也不能由应用程序用于通信。
下面程序是一个将地址绑定到UNIX域套接字的例子。
1 #include "apue.h" 2 #include <sys/socket.h> 3 #include <sys/un.h> 4 5 int 6 main(void) 7 { 8 int fd, size; 9 struct sockaddr_un un; 10 11 un.sun_family = AF_UNIX; 12 strcpy(un.sun_path, "foo.socket"); 13 if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) 14 err_sys("socket failed"); 15 size = offsetof(struct sockaddr_un, sun_path) + strlen(un.sun_path); 16 if (bind(fd, (struct sockaddr *)&un, size) < 0) 17 err_sys("bind failed"); 18 printf("UNIX domain socket bound\n"); 19 exit(0); 20 }
下面是程序的运行情况
唯一连接
服务器进程可以使用标准的bind、listen和accept函数,为客户进程安排一个唯一UNIX域连接。
客户进程使用connect与服务器进程联系,在服务器进程接受了connect请求后,在服务器进程和客户进程之间就存在了唯一连接。
时间: 2024-10-10 09:44:13