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