gpt4 book ai didi

linux - 两个进程之间的通信是否只有一个Unix Domain Socket?

转载 作者:太空狗 更新时间:2023-10-29 11:13:06 26 4
gpt4 key购买 nike

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

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

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

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

  • Unix 域套接字是否不属于任何进程,即 Unix 域套接字是否不是任何进程的连接端点,而是某种程度上类似于两个进程之间的“中间点”?

    <

最佳答案

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

当您以 srwx 开头的 ls -l 时,您看到的并不是真正的“套接字”。这是一个绑定(bind)到套接字的名称(或者过去绑定(bind)到套接字 - 它们死后不会自动删除)。

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

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

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

然后是 socketpair(),它创建了 2 个相互连接的 unix 域套接字,但没有给它们中的任何一个命名。

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

关于linux - 两个进程之间的通信是否只有一个Unix Domain Socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33243492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com