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 套接字中的用途是啥?

SOCK_STREAM & SOCK_DGRAM

流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较

Linux网络编程原始套接字能干什么?

socket

重温网络编程——协议