UNIX domain socket 的通信过程和网络 socket 十分相似,也要先调用 int socket(int family, int type, int protocol) 创建一个 socket 文件描述符.。
family 指定为 AF_UNIX,使用 AF_UNIX 会在系统上创建一个 socket 文件,不同进程通过读写这个文件来实现通信。
type 可以选择 SOCK_DGRAM 或 SOCK_STREAM。SOCK_STREAM 意味着会提供按顺序的、可靠、双向、面向连接的比特流。SOCK_DGRAM 意味着会提供定长的、不可靠、无连接的通信。
protocol 参数指定为 0 即可。
Unix domain socket 与网络 socket 编程最明显的不同在于地址格式不同,用结构体 sockaddr_un 表示,网络编程的 socket 地址是 IP 地址加端口号(服务器端要明确 IP 与端口号),而 UNIX domain socket 的地址是一个 socket 类型的文件在文件系统中的路径(服务器端与客户端要协商好路径,保持一致),这个 socket 文件由 bind() 调用创建,如果调用 bind() 时该文件已存在,则 bind() 错误返回。因此,一般在调用 bind() 前会检查 socket 文件是否存在,如果存在就删除掉。 与网络 socket 编程类似,在 bind 之后要 listen,表示通过 bind 的地址(也就是 socket 文件,在 bind 之后才会形成 socket 文件)提供服务。 接下来必须用 accept() 函数初始化连接。accept() 为每个连接创立新的套接字并从监听队列中移除这个连接。
通信流程如下: