AF_UNIX 套接字上下文中 SOCK_DGRAM 和 SOCK_STREAM 的用途是什么?

Abh*_*gar 1 sockets linux ipc

据我了解,SOCK_DGRAM 和 SOCK_STREAM 对应于使用 INET 地址族完成的无连接和面向连接的网络通信。

现在我正在尝试学习 AF_UNIX 套接字以在同一主机上运行的进程之间执行 IPC,并且我发现我们需要将 sub_socket_type 指定为 SOCK_DGRAM 或 SOCK_STREAM。我无法理解 AF_UNIX 套接字指定子套接字类型的目的是什么。

任何人都可以帮助理解 AF_UNIX 套接字上下文中 SOCK_DGRAM 和 SOCK_STREAM 的意义吗?

Ben*_*Ben 5

TCP 既是流协议,又是面向连接的,而 UDP 是数据报协议,是无连接的。然而,有可能有面向连接的数据报协议。这就是块特殊文件(或 Windows 邮槽)。

(虽然你不能有一个无连接的流协议,它没有意义,除非/dev/null计数)

该标志SOCK_DGRAM并不意味着套接字是无连接的,而是意味着套接字是面向数据报的。

面向流的套接字(以及字符特殊文件,如 /dev/random 或 /dev/null)提供(或消耗,或两者)连续的字节序列,没有固有的结构。结构是通过解释流的内容来提供的。一般来说,流的两端都只有一个进程。

面向数据报的套接字提供(或消耗或两者兼有)大小有限且独立的短消息。一般来说,服务器可以使用recvfrom(为调用者提供要发送回复的地址)从多个客户端接收数据报,并通过sendto指定该地址回复它们。