57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

1.Unix domain
	数据报 socket 的一般描述指出使用数据报 socket 通信是不可靠的。但对于 Unix domain socket 来说,
  数据包传输是在内核中发生的,并且也是可靠的。所有消息都会按序被投递且也不会发生重复。


2.Unix domain socket 权限
	socket 文件的所有权和权限决定了哪些进程能够与这个 socket 进行通信:
	1.要连接一个 Unix domain 流 socket 需要在该 socket 文件上拥有写权限
	2.要通过一个 Unix domain 数据报 socket 发送一个数据报要在该 socket 文件上拥有写权限。
	此外,需要在存放 socket 路径名的所有目录上都拥有执行权限。
	在默认情况下,创建 socket(通过 bind()) 时会给所有者,组以及 other 用户赋予所有权限。要改变这种行为可以在调用 bind() 之前
  先调用 umask() 来禁用不希望赋予的权限。


3.创建互联 socket 对: socketpair(int domain, int protocal, int sockfd[2])
	有时候让单个进程创建一对 socket 并将它们连接起来是比较有用的。这可以通过使用两个 socket() 调用和一个 bind() 调用以及对 listen(),
  connect(), accept()的调用来完成。socketpair() 系统调用则为这个操作过程提供了一个快捷方式。
  	socketpair() 系统调用只能在 Unix domain 中,即 domain 参数必须被指定为 AF_UNIX.(这个约束适用于大多数实现,但却是合理的,因为这一对 socket
  是创建于单个系统上的。) socket 的 type 可以被指定为 SOCK_DTRAM 和 SOCK_STREAM 。protocol 参数必须为0. sockfd 数组返回了引用这2个互相连接的
  socket 的文件描述符。
  	将 type 指定为 SOCK_STREAM 相当于创建了一个双向管道(也称为流管道)。每个 socket 都可以用来读取和写入,并且这2个 socket 之间每个方向上的数据信道
  是分开的。
    一般来讲,socket 对的使用方式与管道的使用方式是类似的。在调用完 socketpair() 之后,进程会使用 fork() 创建一个子进程。子进程会继承父进程的文件描述符
  副本,包括引用了 socket 对的描述符。因此父进程和子进程就可以使用这一对 socket 来进行 IPC 了。
  	使用 socketpair() 创建一对 socket 与手动创建互联的 socket 这2种做法之间的一个差别在于前一对 socket 不会被绑定到任意地址上。这样就能避免一类安全问题了,
  因为这一对 socket 对其他进程是不可见的。


4.Linux 抽象 socket 名空间
	所谓的抽象路径名空间是 Linux 特有的一项特性,它允许将一个 Unix domain socket 绑定到一个名字上但不会再文件系统上创建该名字。优点是:
	1.无需担心与文件系统中的既有名字产生冲突
	2.没有必要在使用完 socket 之后删除 socket 路径名。当 socket 被关闭之后自动删除这个抽象名
	3.无需为 socket 创建一个文件系统路径名。这对于 chroot 环境以及在不具备文件系统上的写权限时是比较有用的。

	要创建一个抽象绑定就需要将 sun_path 字段的第一个字节指定位 null 字节(\0)。这样就能够将抽象 socket 名字与传统 Unix domain socoket 
  路径名区分开来,因为传统的名字是由一个或者多个非空字节以及终止 null 字节构成的字符串。sun_path 字段的余下的字节为 socket 定义了抽象名字。
  在解释这个名字时需要用到全部的字节,而不是将其看成一个以 null 结尾的字符串。

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain

57.Linux/Unix 系统编程手册(下) -- SOCKET : Unix domain