AF_UNIX
和 AF_LOCAL
在计算机网络编程中都是指同一种类型的地址家族,它们被用来创建和管理UNIX域套接字(Unix Domain Sockets)。在不同的系统或标准文档中,可能会使用这两个名称中的任意一个来表示同一概念。
UNIX域套接字 主要用于同一台操作系统中的进程间通信(IPC),不同于基于网络的套接字如 AF_INET
(用于IPv4)或 AF_INET6
(用于IPv6),它并不通过网络进行数据交换,而是利用了操作系统的内核机制,在进程之间直接传递数据。
当在调用 socket()
函数创建套接字时,可以选择 AF_UNIX
或 AF_LOCAL
作为第一个参数 domain
,这表明你将创建的是一个用于本地进程间通信的套接字。
另外,PF_UNIX
和 PF_LOCAL
通常与 AF_UNIX
和 AF_LOCAL
是等价的,只是在某些系统中可能作为另一种表述方式出现。在POSIX兼容的系统中,PF_*
常常作为与 AF_*
对应的协议家族标识符使用,尽管在实践中二者在UNIX域套接字的情况下可互换。
UNIX域套接字可以是:
- SOCK_STREAM 类型,提供一种有序、可靠、双向全双工的连接,类似于TCP。
- SOCK_DGRAM 类型,提供无连接、不可靠的消息服务,类似于UDP,但即使在
SOCK_DGRAM
模式下,UNIX域套接字仍然保证消息边界,即发送的小块数据不会像网络UDP那样被重组。
这种套接字的地址结构是 sockaddr_un
,其中可以包含一个文件系统路径(命名套接字)或是一个在内核中创建的匿名套接字对(由 socketpair()
函数创建)。由于数据传输发生在本地,不需要网络协议栈处理,所以相比网络套接字,UNIX域套接字具有更快的速度和更低的开销。