SOCK_DGRAM 和 SOCK_STREAM 在上下文 AF_UNIX 套接字中的用途是啥?
Posted
技术标签:
【中文标题】SOCK_DGRAM 和 SOCK_STREAM 在上下文 AF_UNIX 套接字中的用途是啥?【英文标题】:What is the purpose of SOCK_DGRAM and SOCK_STREAM in the context AF_UNIX sockets?SOCK_DGRAM 和 SOCK_STREAM 在上下文 AF_UNIX 套接字中的用途是什么? 【发布时间】:2018-06-24 09:27:55 【问题描述】:我了解,SOCK_DGRAM 和 SOCK_STREAM 对应于使用 INET 地址系列完成的无连接和面向连接的网络通信。
现在我正在尝试学习 AF_UNIX 套接字以在同一主机上运行的进程之间执行 IPC,我看到我们需要将 sub_socket_type 指定为 SOCK_DGRAM 或 SOCK_STREAM。我无法理解 AF_UNIX 套接字,指定子套接字类型的目的是什么。
谁能帮助理解 SOCK_DGRAM 和 SOCK_STREAM 在 AF_UNIX 套接字上下文中的重要性?
【问题讨论】:
阻止特殊文件与字符特殊文件。 你能解释一下在使用 AF_UNIX 套接字的 IPC 上下文中这两者(块和字符特殊文件)的功能吗? 【参考方案1】:碰巧TCP既是流协议,又是面向连接的,而UDP是数据报协议,是无连接的。然而,可以有一个面向连接的数据报协议。这就是块特殊文件(或 Windows Mailslot)。
(你不能有一个无连接的流协议,它没有意义,除非/dev/null
很重要)
标志SOCK_DGRAM
并不表示套接字是无连接的,它表示套接字是面向数据报的。
面向流的套接字(以及像 /dev/random 或 /dev/null 这样的字符特殊文件)提供(或消耗,或两者)连续的字节序列,没有固有结构。通过解释流的内容来提供结构。一般来说,流的两端只有一个进程。
面向数据报的套接字,提供(或使用或两者兼有)大小有限且自包含的短消息。一般来说,服务器可以使用recvfrom
(它为调用者提供一个发送回复的地址)接收来自多个客户端的数据报,并使用指定该地址的sendto
回复它们。
【讨论】:
【参考方案2】:这个问题也让我困惑了一段时间,但正如 Ben 所说,套接字类型是 SOCK_STREAM 或 SOCK_DGRAM ,它们都意味着访问客户端和服务器之间的进程间通信的相同方式。在 AF_UNIX 域下,没有任何区别。
【讨论】:
以上是关于SOCK_DGRAM 和 SOCK_STREAM 在上下文 AF_UNIX 套接字中的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章
SOCK_DGRAM 和 SOCK_STREAM 在上下文 AF_UNIX 套接字中的用途是啥?