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

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

有没有像IP协议格式和TCP/UDP格式那样的unix域协议格式?域套接字数据报协议的格式是否在某处发布?每个unix都是不同的吗?或者像POSIX这样的标准化了吗?

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

推荐答案

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

没有"unix域协议格式".不需要这样做,因为Unix域套接字无法通过网络连接连接到对等方.在内核中,代表SOCK_STREAM Unix域套接字一端的文件描述符指向一个数据 struct ,该数据 struct 告诉内核哪个文件描述符位于连接的另一端.当您向文件描述符写入数据时,内核会在连接的另一端查找文件描述符,并将数据附加到另一个文件描述符的读取缓冲区.内核不需要将数据放入一个带有描述其目的地的头的数据包中.

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

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

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

Linux相关问答推荐

如何检测文件系统是否支持权限?

UTF-8输入和使用XGetICValues

如何创建一堆文件中所有单词的列表?

Qt会泄漏内存吗?

inotifywait 可以说文件在另一个进程可以访问之前已关闭吗?

为什么控制台不接受反向换行?

输出特定字符的所有列号

c++进程状态中的+是什么意思

为什么 Linux (x86) 的页面大小是 4 KB,这是如何计算的?

在不调试的情况下查找哪个汇编指令导致了非法指令错误

如何在python中检索进程开始时间(或正常运行时间)

错误:命令gcc在 CentOS 上失败,退出状态为 1

bash 中的sed命令

如何更改某些文件模式/扩展名的权限?

如何在 Ubuntu 上安装 chkconfig?

Linux 上 pid_t、uid_t、gid_t 的大小

kdevtmpfsi 使用整个 CPU

是否有一个 linux 命令来确定与给定进程 ID 关联的窗口 ID?

比较两个图像的 python/linux 方式

如何使用 bash 在文件中间添加一行文本?