首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在两个进程之间的通信中是否只有一个Unix域套接字?

在两个进程之间的通信中是否只有一个Unix域套接字?
EN

Stack Overflow用户
提问于 2015-10-20 17:52:59
回答 1查看 1.1K关注 0票数 3

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

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

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

  • 这是否意味着这两个进程仅通过一个Unix域套接字进行通信,而不是两个?
  • Unix域套接字是否不属于任何进程,即Unix域套接字是否不是任何进程的连接端点,但在某种程度上类似于两个进程之间的“中间点”?
EN

回答 1

Stack Overflow用户

发布于 2015-10-20 20:23:02

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

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(),它创建两个连接在一起的unix域套接字,而不给它们任何一个命名。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33243492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档