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

问题描述 投票:0回答:3

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

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

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

linux sockets ipc
3个回答
4
投票

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

(虽然你不能有无连接的流协议,但它没有意义,除非

/dev/null
重要)

标志

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

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

面向数据报的套接字,提供(或消耗或两者兼有)大小有限且独立的短消息。一般来说,服务器可以使用

recvfrom
(为调用者提供要发送回复的地址)从多个客户端接收数据报,并使用
sendto
指定该地址回复它们。


0
投票

这个问题也让我困惑了一段时间,但正如Ben所说,套接字类型是 SOCK_STREAM 或 SOCK_DGRAM ,它们都意味着以相同的方式访问客户端和服务器之间的进程间通信。在 AF_UNIX 域下,没有一点区别。


0
投票

我相信这就是答案,但如果不是,我希望得到纠正。所以公平警告只有第一段我完全有信心:

主要区别在于,使用 SOCK_DGRAM 时,保证整个数据包从客户端发送到服务器,并在服务器收到时完整接收(当然,只要服务器中的缓冲区足够大)包含整个数据包)。它还保留消息边界 - 如果您使用 SOCK_DGRAM 执行两次写入,服务器将必须执行两次读取才能获取两者。对于 SOCK_STREAM 来说,情况并非如此——至少在理论上是这样。

但是(让我提醒读者,我对此可能是错误的)

服务器无法使用 SOCK_DGRAM 向客户端发送数据。如果服务器是 SOCK_DGRAM,则无法回复客户端。 (显然)没有端点,或者至少我无法让它工作,而且我找不到示例,甚至使用 recvfrom 和 sendto 也不起作用。 SOCK_DGRAM 是一种方式,从客户端到服务器,如果要双向,则需要两个套接字。

基本上,使用 SOCK_STREAM,似乎没有人将 SOCK_DGRAM 与 AF_UNIX 套接字一起使用。

有一种可能性(你应该应对)你会得到两个 单个数据包或部分数据包中的消息,您应该在编码时考虑到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.