2015-10-20 19 views
2

有两种套接字:网络套接字和Unix域套接字。在两个进程之间的通信中是否只有一个Unix域套接字?

当两个进程使用网络套接字进行通信时,每个进程都创建自己的网络套接字,并且这些进程通过它们的套接字之间的连接进行通信。有两个插座,每个属于不同的进程,是每个进程的连接端点

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

  • 这是否意味着两个进程仅通过一个Unix域套接字而不是两个进行通信?

  • 是否Unix域套接字不属于任何过程,即是Unix域套接字没有任何过程的连接端点,但不知何故,像两个进程之间的“中间点”?

+0

感谢。是否有每个进程的unix域套接字作为进程连接的端点,或者对于通信中的所有进程只有一个unix域套接字? – Tim

回答

1

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

当您以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域套接字,但没有给出任何名称。

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

相关问题