【问题标题】:Is there only one Unix Domain Socket in the communication between two processes?两个进程之间的通信是否只有一个 Unix Domain Socket?
【发布时间】:2016-01-19 12:23:37
【问题描述】:

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

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

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

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

  • Unix Domain socket 是否不属于任何进程,即 Unix domain socket 不是任何进程的连接端点,而是有点像两个进程之间的“中间点”?

    李>

【问题讨论】:

  • 谢谢。每个进程是否有一个unix域套接字作为与进程的连接端点,还是通信中的所有进程只有一个unix域套接字?

标签: linux sockets unix operating-system ipc


【解决方案1】:

有两个套接字,连接的每一端一个。它们中的每一个独立地在文件系统中可能有也可能没有名称。

ls -lsrwx 开头时看到的东西并不是真正的“套接字”。这是一个绑定到套接字的名称(或者过去绑定到套接字 - 它们在死后不会自动被删除)。

打个比方:想想 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 域套接字,但没有给它们中的任何一个命名。

(这里没有提到,也不是很有趣:“抽象”命名空间。)

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多