有两个插座,连接的两端各有一个。它们中的每一个都可以独立地在文件系统中有或没有名称。
当您以srwx
开头的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域套接字,但没有给出任何名称。
(这里没有提到,并没有真正有意思: “抽象” 的命名空间。)
感谢。是否有每个进程的unix域套接字作为进程连接的端点,或者对于通信中的所有进程只有一个unix域套接字? – Tim