network uds(Unix domain socket)

Unix domain socket 用于实现同一主机上的进程通信。

socket 原本是为网络通讯设计的,但后来在 socket 的框架上发展出一种 IPC 机制,就是 UNIX domain socket。虽然网络 socket 也可用于同一台主机的进程间通讯(通过 loopback 地址 127.0.0.1),但是 UNIX domain socket 用于 IPC 更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC 机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。

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() 为每个连接创立新的套接字并从监听队列中移除这个连接。

通信流程如下:

原文地址:https://www.cnblogs.com/tongyishu/p/13786687.html