在两个进程之间的通信中是否只有一个Unix域套接字?

有两种套接字:networking套接字和Unix域套接字。

当两个进程使用networking套接字进行通信时,每个进程创build自己的networking套接字,并且进程通过套接字之间的连接进行通信。 有两个套接字,每个属于不同的进程,是每个进程的连接端点

当两个进程使用Unix域套接字进行通信时,Unix域套接字通过文件系统中的文件名进行寻址。

有两个插座,连接的每一端都有一个插座。 它们中的每一个都可以独立地在文件系统中有或没有名字。

当你用ls -l开始的时候看到的东西并不是真正的“套接字”。 这是一个绑定到套接字的名字(或者在过去被绑定到套接字上 – 当它们死了的时候它们不会被自动删除)。

比喻:考虑TCP套接字。 他们中的大多数都涉及一个具有众所周知的端口号的端点(22个SSH; 25个SMTP; 80个HTTP;等等)。服务器创建一个套接字并绑定到该知名端口。 客户端创建一个套接字并连接到知名端口。 客户端套接字也有一个端口号,你可以在一个数据包跟踪(tcpdump / wireshark)中看到,但它不是一个固定的数字,它只是一些由客户端的内核自动选择的号码,因为它还没有被使用。

在unix域套接字中,路径名就像端口号。 如果您希望客户端能够找到您的服务器套接字,则需要将其绑定到一个众所周知的名称,如/dev/log/tmp/.X11-unix/X0 。 但客户端不需要有一个知名的名称,所以通常不会做一个bind() 。 因此,名称/tmp/.X11-unix/X0只与服务器套接字关联。 你可以用netstat -x来确认。 大约一半的插座将有路径名,另一半不会。 或者编写自己的客户机/服务器对,并在客户机上调用getsockname() 。 它的名字将是空的,而服务器上的getsockname()会给出路径名。

自动分配给TCP客户端的临时端口号在unix域套接字地址中没有对应端口。 在TCP中,必须有一个本地端口号,以便传入的数据包可以匹配到正确的套接字。 Unix域套接字直接在其内核数据结构中链接,所以没有必要。 客户端可以连接到服务器并且没有名字。

然后是socketpair() ,它创建了2个相互连接的unix域套接字,而不给任何一个名称。

(这里没有提到,也没有真正有趣:“抽象”的命名空间。)