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

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

APUE:

17.3 独特的联系

服务器可以安排独特的 UNIX 域连接使用标准 、 和 函数向客户bind提供listen信息accept。客户端用来connect联系服务器;连接请求被服务器接受后,客户端和服务器之间就存在唯一的连接。这种操作方式与我们所说明的相同互联网域套接字如图 16.16 和 16.17 所示。

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

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

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

谢谢。

答案1

我不确信我喜欢 Steffen Ullrich 在该主题上的措辞。套接字本质上是复杂的,因为它们是一个通用接口,可用于许多非常不同的协议(见注1)。

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

  • 所有协议都必须有某种地址机制。 (见注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 套接字很时髦,因为没有底层协议,它们是内核的构造。内核可以自由地使用它自己的套接字索引节点作为地址机制。正如 mosvy 指出的那样,当您尝试确定 unix 套接字的地址时,这可能会导致奇怪的行为。

答案2

  1. 最多一个。
  2. 区分套接字文件和 fifo 文件的使用方式。打开命名的 fifo 进行写入不会与读取器创建唯一的连接。 (或相反亦然)。换句话说,这样做是为了与第 15.5 节“FIFO”形成对比。

相关内容