Tim*_*Tim 2 linux socket unix-sockets
从APUE:
17.3 独特的连接
一台服务器可以安排独特的UNIX域连接使用标准的客户
bind
,listen
和accept
功能。客户端connect
用来联系服务器;服务器接受连接请求后,客户端和服务器之间存在唯一连接。这种操作方式与我们用Internet 域套接字说明的相同在图 16.16 和 16.17。
如果我是对的, 两个 Internet 域 TCP 套接字之间最多只能有一个连接。
两个 Unix 域套接字之间可以有多少个连接?
如果最多也有一个,那为什么书中专门用一节来使两个 unix 域套接字之间的连接唯一?
谢谢。
我不相信我喜欢 Steffen Ullrich 关于该主题的措辞。套接字自然很复杂,因为它们是一个通用接口,可用于许多非常不同的协议(参见注释 1)。
为了在不同协议之间进行概括,套接字接口标识了不同协议的共同特征:
SOCK_STREAM 协议通常与 SOCK_DGRAM 协议非常不同。但是在这些组中的每一个中,协议并没有太大区别。
面向连接的协议总是(?)一对套接字,它们之间在单个连接中发送数据。连接协议通常也支持某种形式的“侦听”套接字,其唯一目的是等待新的连接请求。
将面向连接的套接字视为两个电话,它们之间有一条线路。
呼叫connect()
和accept()
产生一个带有两个绑定套接字的新连接(连接的每一侧一个)。
面向数据报的协议非常不同。套接字可以配置为有点像邮箱,从任何地方接收消息。没有要求有连接。在 UDP 的情况下,从任何 IP 和端口发送到正确 IP 和端口的任何数据包都将被同一个套接字接收。因此,您可以通过同一个套接字与多台不同的计算机进行对话。
connect()
在 SOCK_DGRAM 套接字上有一个特殊的含义。
如果套接字 sockfd 是 SOCK_DGRAM 类型,则 addr 是默认发送数据报的地址,也是接收数据报的唯一地址。
这不会创建新的唯一连接。它只是限制了这个套接字将接收哪些消息,而不是另一端的套接字。
该sendto()
函数允许程序发送消息并指定发送地址。
它们有两种风格(SOCK_STREAM 和 SOCK_DGRAM),就像互联网套接字(TCP 和 UDP)一样。所以对于 SOCK_STREAM unix 套接字,是的,它们在一对套接字之间只有一个连接。但是 SOCK_DGRAM unix 套接字是不同的(就像 UDP 与 TCP 不同)。
注 1:Unix 套接字很时髦,因为没有底层协议本身,它们是内核的构造。内核可以自由地使用它自己的套接字 inode 作为地址机制。正如 mosvy 指出的那样,当您尝试确定 unix 套接字的地址时,这可能会导致奇怪的行为。