Unix Domain Sockets如何区分多个客户端?

Tra*_*ain 61 unix sockets linux ipc

TCP具有元组对(IP地址/端口/类型)以告知一个客户端与另一个客户端.UDP传递客户端IP和端口.unix域如何跟踪不同的客户端?

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

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

感谢任何照明.我找不到任何解释这个的信息.每个消息来源都掩盖了如何使用域套接字.

rob*_*off 91

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

没有"unix域协议格式".没有必要,因为Unix域套接字不能通过网络连接连接到对等体.在内核中,表示SOCK_STREAMUnix域套接字结尾的文件描述符指向一个数据结构,该数据结构告诉内核哪个文件描述符位于连接的另一端.将数据写入文件描述符时,内核会在连接的另一端查找文件描述符,并将数据附加到其他文件描述符的读取缓冲区.内核不需要将数据放在包含描述其目标的标头的数据包中.

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

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

如果未绑定路径,则接收进程无法获取唯一标识对等方的标识.至少,不是我正在运行的Linux内核(2.6.18-238.19.1.el5).

  • 在Linux中还有用于AF_UNIX的SOCK_SEQPACKET,它可以像SOCK_STREAM中那样允许连接,但是也可以像SOCK_DGRAM中那样保留消息边界。 (3认同)