Unix 域套接字如何区分多个客户端?

TCP 有元组对(IP Addr/port/type)来区分一个客户机和另一个客户机。UDP 传递客户端 IP 和端口。Unix 域如何跟踪不同的客户端?

换句话说,服务器创建一个绑定到某个路径(比如/tmp/socket)的套接字。2个或更多客户端连接到/tmp/socket。在跟踪来自 client1和 client2的数据的下面发生了什么?我想网络栈在域套接字中没有任何作用,那么内核在这里做所有的工作吗?

是否存在 Unix 域协议格式,如 IP 协议格式和 TCP/UDP 格式?域套接字数据报协议的格式是否在某处发布?每个 unix 是不同的还是像 POSIX 这样的标准化了它?

谢谢你的解释。我找不到任何可以解释这一切的信息。每个来源只是掩盖了如何使用域套接字。

33361 次浏览

如果创建一个类型为 SOCK_STREAMPF_UNIX套接字,并接受其上的连接,那么每次接受连接时,都会得到一个新的文件描述符(作为 accept系统调用的返回值)。此文件描述符从客户端进程中的文件描述符读取数据并将数据写入文件描述符。因此,它的工作方式就像一个 TCP/IP 连接。

没有“ Unix 域协议格式”。不需要,因为 Unix 域套接字不能通过网络连接连接到对等端。在内核中,表示 SOCK_STREAM Unix 域套接字末端的文件描述符指向一个数据结构,该数据结构告诉内核连接的另一端是哪个文件描述符。当您向文件描述符写入数据时,内核会在连接的另一端查找文件描述符,并将数据追加到该另一个文件描述符的读缓冲区。内核不需要将数据放在一个包中,包头描述其目的地。

对于 SOCK_DGRAM套接字,您必须告诉内核应该接收数据的套接字的路径,并且它使用该路径来查找接收套接字的文件描述符。

如果在连接到服务器套接字之前(或者在使用 SOCK_DGRAM发送数据之前)将一个路径绑定到客户端套接字,那么服务器进程可以使用 getpeername(对于 SOCK_STREAM)获得该路径。对于 SOCK_DGRAM,接收端可以使用 recvfrom来获取发送套接字的路径。

如果不绑定路径,那么接收进程就无法获得唯一标识对等方的 id。至少,在我正在运行的 Linux 内核上(2.6.18-238.19.1.el5)没有。