有两种套接字:网络套接字和Unix域套接字。
当两个进程使用网络套接字进行通信时,每个进程创建自己的网络套接字,进程通过它们的套接字之间的连接进行通信。有两个套接字,每个套接字属于不同的进程,是每个进程的连接端点。
当两个进程使用Unix域套接字进行通信时,Unix域套接字由文件系统中的文件名寻址。
发布于 2015-10-20 20:23:02
有两个套接字,一个在连接的两端。它们中的每一个,独立地,可能在文件系统中有名字,也可能没有。
当ls -l以srwx开头时,您看到的并不是真正的“套接字”。它是一个绑定到套接字上的名称(或者过去绑定到一个套接字--它们死后不会自动被移除)。
类推:想想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域套接字,而不给它们任何一个命名。
(这里没有提到,也不是很有趣:“抽象”命名空间。)
https://stackoverflow.com/questions/33243492
复制相似问题