我说得对吗
当两个进程通过网络套接字进行通信时,每个进程都会创建一个套接字(每个套接字属于一个进程),进程之间通过各自的套接字进行通信。
当两个进程通过Unix域套接字通信时,只创建一个套接字(不属于任何进程),并且两个进程都连接到同一个套接字?
答案1
你在这里混淆了两件事。
套接字是提供给程序的文件描述符(句柄),以便程序可以像使用文件一样使用网络连接。套接字API与协议无关;可以为 IPv4 连接或 IPv6 连接创建套接字,但(在内核支持的情况下)也可以为 DECnet、AppleTalk 或读取以太网等创建套接字。
由于套接字 API 相当容易使用,但由于使用实际网络协议与同一台计算机上的进程进行通信的效率相当低,因此在某些时候创建了 UNIX 域套接字,以允许使用套接字 API,而不会出现效率低下的情况。它还添加了一些额外的功能;例如,可以通过 UNIX 域套接字将文件描述符传递给另一个进程。
当使用 UNIX 域套接字时,两个进程仍然持有一个套接字,连接的每一侧都有一个套接字。除了初始连接设置之外,套接字的使用与 IPv4 套接字没有什么不同。
套接字 API 离不开的一件事就是地址;如果不传递一个要与之通信的地址,就不可能创建一个套接字,这对于 UNIX 域套接字来说没有什么不同。由于它是 UNIX,无论如何一切都是文件,因此决定使这些地址看起来像文件名。既然我们已经这样做了,那么让这些地址出现在文件系统中是有意义的,因为这样可以很容易地发现它们。
不幸的是,文件系统中这些东西的名称是还“UNIX 域套接字”(或者至少人们开始这么称呼它们)。他们不是实际的然而,套接字 API 意义上的套接字;不可能,因为这些只是一个数字。因此,它们在 IPv4 套接字中的对应数字不是该数字,而是您正在通话的对等方的 IP 地址和端口号。
有时,我会补充一点,由于套接字 API 不直接处理文件,因此这些文件系统表示并不是绝对必要的。事实上,Linux 有一个“匿名 UNIX 域套接字”的概念,它就是:文件系统中没有任何链接的 UNIX 域套接字......