apue学习笔记(第十七章 高级进程间通讯)

本章介绍一种高级IPC---UNIX域套接字机制,并说明它的应用方法服务器

 

 

UNIX域套接字网络

UNIX域套接字用于在同一台计算机上运行的进程(无关进程)之间的(全双工)通讯。相比于因特网套接字,UNIX域套接字效率更高。dom

UNIX域套接字仅仅复制数据,不执行协议处理,不须要添加或删除网络报头,无需计算校验和,不要产生顺序号,无需发送确认报文。socket

UNIX域套接字提供流和数据报两种接口,就像是套接字和管道的混合(双向的通讯),使用socketpair函数建立一对无命名的、相互链接的UNIX域套接字ide

#include <sys/socket.h>
int socketpair(int domain,int type,int protocol,int sockfd[2]);

也能够使用它们面向网络的域套接字接口(socket)创建该套接字。函数

一对相互链接的UNIX域套接字能够起到全双工管道的做用:两端对读和写开放。学习

 

 

命名UNIX域套接字spa

上一章学习了而后将一个地址绑定到一个因特网域套接字上。跟因特网域套接字同样,能够命名UNIX域套接字,并可将其用于告示服务。code

UNIX域套接字的地址由sockaddr_un结构表示,在Linux 3.2.0和Solaris 10中定义以下blog

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 }
View Code

下面是程序的运行状况

 

 

 

惟一链接

服务器进程能够使用标准的bind、listen和accept函数,为客户进程安排一个惟一UNIX域链接。

客户进程使用connect与服务器进程联系,在服务器进程接受了connect请求后,在服务器进程和客户进程之间就存在了惟一链接。

 

相关文章
相关标签/搜索