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

时间:2015-10-20 17:53:00

标签: linux sockets unix operating-system ipc

有两种套接字:网络套接字和Unix域套接字。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

当你以ls -l开头srwx时,你看到的东西并不是真正的"套接字"。它是绑定到套接字的名称(或者过去绑定到套接字 - 当它们“死亡”时它们不会被自动删除。)

类比:想想TCP套接字。其中大多数涉及具有众所周知的端口号的端点(22个SSH; 25个SMTP; 80个HTTP;等等)服务器创建一个套接字并绑定到众所周知的端口。客户端创建套接字并连接到众所周知的端口。客户端套接字还有一个端口号,您可以在数据包跟踪(tcpdump / wireshark)中看到它,但它不是固定数字,它只是客户端自动选择的某个数字&# 39; s内核,因为它还没有被使用。

在unix域套接字中,路径名与端口号类似。如果您希望客户端能够找到您的服务器套接字,则需要将其绑定到一个众所周知的名称,例如/dev/log/tmp/.X11-unix/X0。但客户并不需要拥有一个众所周知的名称,因此通常情况下它不会bind()。因此,名称/tmp/.X11-unix/X0仅与服务器套接字相关联。您可以使用netstat -x进行确认。列出的大约一半的插座将具有路径名,而另一半则不会。或编写自己的客户端/服务器对,并在客户端上调用getsockname()。它的名称将为空,而服务器上的getsockname()给出路径名。

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

然后有socketpair()创建了2个相互连接的unix域套接字,而没有为其中任何一个提供名称。

(这里没有提及,并不是很有趣:"抽象"命名空间。)