两个 Unix 域套接字之间可以有多少个连接?

Tim*_*Tim 2 linux socket unix-sockets

APUE

17.3 独特的连接

一台服务器可以安排独特的UNIX域连接使用标准的客户bindlistenaccept功能。客户端connect用来联系服务器;服务器接受连接请求后,客户端和服务器之间存在唯一连接。这种操作方式与我们用Internet 域套接字说明的相同在图 16.16 和 16.17。

如果我是对的, 两个 Internet 域 TCP 套接字之间最多只能有一个连接

两个 Unix 域套接字之间可以有多少个连接?

如果最多也有一个,那为什么书中专门用一节来使两个 unix 域套接字之间的连接唯一?

谢谢。

Phi*_*ing 5

我不相信我喜欢 Steffen Ullrich 关于该主题的措辞。套接字自然很复杂,因为它们是一个通用接口,可用于许多非常不同的协议(参见注释 1)。

为了在不同协议之间进行概括,套接字接口标识了不同协议的共同特征:

  • 所有协议都必须具有某种地址机制。(见注一
  • 所有数据都从一个地址发送到一个地址。
  • 这里讨论两种类型的协议很有用:
    • 一些协议代表一个连接:SOCK_STREAM
    • 一些协议代表一系列消息:SOCK_DGRAM

SOCK_STREAM 协议通常与 SOCK_DGRAM 协议非常不同。但是在这些组中的每一个中,协议并没有太大区别。

SOCK_STREAM

  • 示例:TCP
  • 数据以长流的形式到达,没有任何中断。
  • 数据总是按照发送的顺序到达

面向连接的协议总是(?)一对套接字,它们之间在单个连接中发送数据。连接协议通常也支持某种形式的“侦听”套接字,其唯一目的是等待新的连接请求。

将面向连接的套接字视为两个电话,它们之间有一条线路。

呼叫connect()accept()产生一个带有两个绑定套接字的新连接(连接的每一侧一个)。

SOCK_DGRAM

  • 示例 UDP
  • 数据到达它发送的相同块(消息)中,而不是混合成连续的流
  • 消息可能不会按顺序到达。

面向数据报的协议非常不同。套接字可以配置为有点像邮箱,从任何地方接收消息。没有要求有连接。在 UDP 的情况下,任何 IP 和端口发送正确 IP 和端口的任何数据包都将被同一个套接字接收。因此,您可以通过同一个套接字与多台不同的计算机进行对话。

connect()在 SOCK_DGRAM 套接字上有一个特殊的含义。

如果套接字 sockfd 是 SOCK_DGRAM 类型,则 addr 是默认发送数据报的地址,也是接收数据报的唯一地址。

这不会创建新的唯一连接。它只是限制了这个套接字将接收哪些消息,而不是另一端的套接字。

sendto()函数允许程序发送消息并指定发送地址。

Unix 域套接字

它们有两种风格(SOCK_STREAM 和 SOCK_DGRAM),就像互联网套接字(TCP 和 UDP)一样。所以对于 SOCK_STREAM unix 套接字,是的,它们在一对套接字之间只有一个连接。但是 SOCK_DGRAM unix 套接字是不同的(就像 UDP 与 TCP 不同)。


注 1:Unix 套接字很时髦,因为没有底层协议本身,它们是内核的构造。内核可以自由地使用它自己的套接字 inode 作为地址机制。正如 mosvy 指出的那样,当您尝试确定 unix 套接字的地址时,这可能会导致奇怪的行为。