来自Tanenbaum计算机网络的Berkeley Sockets API简介,
在服务器端:
SOCKET
原语新创建的套接字没有网络 地址。这些是使用BIND
原语分配的。一旦 服务器已将地址绑定到套接字,远程客户端可以连接到 它。没有
SOCKET
调用的原因是直接创建地址 是某些过程关心他们的地址(例如,他们有 多年来一直使用相同的地址,每个人都知道这一点 地址),而其他人没有。
为什么没有SOCKET
调用直接创建地址,
因为某些流程关心他们的地址,而其他流程则关心
别'?吨
在客户端:
现在让我们看一下客户端。在这里,套接字必须首先 使用
SOCKET
原语创建,但从那时起不需要BIND
使用的地址对服务器无关紧要。
为什么BIND
不需要,因为使用的地址无关紧要
到服务器?
答案 0 :(得分:1)
为什么没有SOCKET调用直接创建地址,因为有些进程关心他们的地址,而其他进程不在?
因为这是他们设计它的方式。听力套接字不需要目标地址,在大多数情况下,他们也不需要源地址(INADDR_ANY);并且大多数客户端套接字也不需要特定的源地址。在大多数情况下,客户端根本不需要致电bind()
。因此将地址放入套接字创建API将毫无意义。
没有SOCKET调用直接创建地址的原因是某些进程关心他们的地址(例如,他们多年来一直使用相同的地址,每个人都知道这个地址),而其他人则不知道。
我不同意这个奇怪的陈述。
为什么不需要BIND,因为使用的地址对服务器无关紧要?
这是另一个奇怪的表达声明。可以通过静态IP路由表自动确定连接套接字的源地址。只要客户端可以完全连接到服务器,对称性保证服务器可以在同一连接上发送回客户端,因此客户端的实际源地址对于cleint或者具体来说并不重要。服务器应用程序。当然对TCP来说很重要,否则它就不会存在。
答案 1 :(得分:1)
为什么没有SOCKET调用直接创建地址,因为有些进程关心他们的地址,而有些进程不关心?
基本上,因为严格的客户端(例如Web浏览器)不关心其本地IP地址/端口是什么。通过不要求SOCKET调用来创建/分配地址,它可以允许BIND调用实际上永远不会发生在客户端上下文中(通常无关紧要),而是发生在服务器上下文中(非常重要)。
为什么不需要BIND,因为使用的地址对服务器无关紧要?
这与上面答案的第一部分有关。套接字只需要绑定到特定的地址和端口,以便能够伸出一些东西并连接到它。在许多情况下(例如Web浏览器),没有任何理由可以连接到它 - 它只需要能够连接到其他系统(服务器)。
为了使其成为一般原则,您只需要将一个套接字绑定到一个地址,当其他东西需要连接到它时。如果它只连接到其他东西,你不需要BIND一个套接字。