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

2024-02-25

TCP 具有元组对(IP 地址/端口/类型)来区分一个客户端和另一个客户端。 UDP 传递客户端 IP 和端口。 unix 域如何跟踪不同的客户端?

换句话说,服务器创建一个绑定到某个路径(例如/tmp/socket)的套接字。 2 个或更多客户端连接到 /tmp/socket。跟踪 client1 和 client2 的数据到底发生了什么?我想网络堆栈在域套接字中不起作用,那么内核是否在这里完成所有工作?

是否有像IP协议格式和TCP/UDP格式那样的unix域协议格式?域套接字数据报协议的格式是否在某处发布?每个 UNIX 都不同吗?还是 POSIX 之类的东西对其进行了标准化?

感谢您的任何启发。我找不到任何解释这一点的信息。每个来源都只是掩盖了如何使用域套接字。


如果您创建一个PF_UNIX插座类型SOCK_STREAM,并接受其上的连接,然后每次接受连接时,您都会获得一个新的文件描述符(作为accept系统调用)。该文件描述符从客户端进程中的文件描述符读取数据并向其写入数据。因此它的工作方式就像 TCP/IP 连接。

不存在“unix 域协议格式”。不需要,因为 Unix 域套接字无法通过网络连接连接到对等方。在内核中,文件描述符代表了一个文件的末尾SOCK_STREAMUnix 域套接字指向一个数据结构,该数据结构告诉内核哪个文件描述符位于连接的另一端。当您将数据写入文件描述符时,内核会查找连接另一端的文件描述符,并将数据附加到其他文件描述符的读取缓冲区。内核不需要将数据放入带有描述其目的地的标头的数据包中。

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

如果在连接到服务器套接字之前(或者在发送数据之前,如果您使用的是SOCK_DGRAM),然后服务器进程可以使用以下方式获取该路径getpeername (for SOCK_STREAM)。为一个SOCK_DGRAM,接收方可以使用recvfrom获取发送套接字的路径。

如果不绑定路径,则接收进程无法获得唯一标识对等点的 id。至少,在我运行的 Linux 内核上不是这样(2.6.18-238.19.1.el5).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unix 域套接字如何区分多个客户端? 的相关文章

随机推荐