Unix域套接字如何区分多个客户端?
TCP具有元组对(IP地址/端口/types)来告诉另一个客户端。 UDP传递客户端IP和端口。 unix域如何跟踪不同的客户端?
换句话说,服务器创build一个绑定到某个path的套接字say / tmp / socket。 2个或更多客户端连接到/ tmp / socket。 底下发生了什么,跟踪client1和client2的数据? 我猜想networking堆栈在域套接字中不起作用,所以内核在这里做所有的工作?
有没有像IP协议格式和TCP / UDP格式的unix域协议格式? 域套接字数据报协议的格式是否在某处发布? 是每个unix不同还是像POSIX那样做标准化呢?
感谢任何照明。 我找不到任何解释这一点的信息。 每个来源只是掩饰如何使用域套接字。
如果创build了一个types为SOCK_STREAM
的PF_UNIX
套接字,并接受其上的连接,那么每次接受连接时,都会得到一个新的文件描述符(作为accept
系统调用的返回值)。 该文件描述符从客户机进程中的文件描述符读取数据并将数据写入文件描述符。 因此,它就像TCP / IP连接一样工作。
没有“unix域协议格式”。 这不需要,因为Unix域套接字不能通过networking连接连接到对等体。 在内核中,表示SOCK_STREAM
Unix域套接字末尾的文件描述符指向一个数据结构,该数据结构告诉内核哪个文件描述符位于连接的另一端。 将数据写入文件描述符时,内核在连接的另一端查找文件描述符,并将数据附加到其他文件描述符的读取缓冲区。 内核不需要把数据放入一个包含描述其目的地的头部的数据包中。
对于SOCK_DGRAM
套接字,必须告诉内核应该接收数据的套接字path,并使用它来查找接收套接字的文件描述符。
如果在连接到服务器套接字之前(或者在使用SOCK_DGRAM
发送数据之前)将path绑定到客户端套接字,则服务器进程可以使用getpeername
(对于SOCK_STREAM
)获取该path。 对于SOCK_DGRAM
,接收端可以使用recvfrom
来获取发送套接字的path。
如果你不绑定一个path,那么接收过程就不能得到唯一标识对等体的id。 至less,不是我正在运行的Linux内核( 2.6.18-238.19.1.el5
)。