首页 文章

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

提问于
浏览
52

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

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

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

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

1 回答

  • 80

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

    因为Unix域套接字无法通过网络连接连接到对等体,所以需要这样做 . 在内核中,表示 SOCK_STREAM Unix域套接字结尾的文件描述符指向一个数据结构,该数据结构告诉内核哪个文件描述符位于连接的另一端 . 当您将数据写入文件描述符时,内核会在连接的另一端查找文件描述符,并将数据附加到另一个文件描述符's read buffer. The kernel doesn't,需要将数据放入包含描述其目标的标头的数据包中 .

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

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

    如果您没有't bind a path, then the receiving process can' t获取唯一标识对等方的ID . 至少,不是我正在运行的Linux内核( 2.6.18-238.19.1.el5 ) .

相关问题