解决Socket编程中的问题

时间:2015-10-08 04:41:47

标签: sockets network-programming

来自Tanenbaum计算机网络的Berkeley Sockets API简介,

  1. 在服务器端:

      

    SOCKET原语新创建的套接字没有网络   地址。这些是使用BIND原语分配的。一旦   服务器已将地址绑定到套接字,远程客户端可以连接到   它。

         

    没有SOCKET调用的原因是直接创建地址   是某些过程关心他们的地址(例如,他们有   多年来一直使用相同的地址,每个人都知道这一点   地址),而其他人没有。

    为什么没有SOCKET调用直接创建地址, 因为某些流程关心他们的地址,而其他流程则关心 别'?吨

  2. 在客户端:

      

    现在让我们看一下客户端。在这里,套接字必须首先   使用SOCKET原语创建,但从那时起不需要BIND   使用的地址对服务器无关紧要。

    为什么BIND不需要,因为使用的地址无关紧要 到服务器?

2 个答案:

答案 0 :(得分:1)

  

为什么没有SOCKET调用直接创建地址,因为有些进程关心他们的地址,而其他进程不在?

因为这是他们设计它的方式。听力套接字不需要目标地址,在大多数情况下,他们也不需要源地址(INADDR_ANY);并且大多数客户端套接字也不需要特定的源地址。在大多数情况下,客户端根本不需要致电bind()。因此将地址放入套接字创建API将毫无意义。

  
    

没有SOCKET调用直接创建地址的原因是某些进程关心他们的地址(例如,他们多年来一直使用相同的地址,每个人都知道这个地址),而其他人则不知道。

  

我不同意这个奇怪的陈述。

  

为什么不需要BIND,因为使用的地址对服务器无关紧要?

这是另一个奇怪的表达声明。可以通过静态IP路由表自动确定连接套接字的源地址。只要客户端可以完全连接到服务器,对称性保证服务器可以在同一连接上发送回客户端,因此客户端的实际源地址对于cleint或者具体来说并不重要。服务器应用程序。当然对TCP来说很重要,否则它就不会存在。

答案 1 :(得分:1)

  

为什么没有SOCKET调用直接创建地址,因为有些进程关心他们的地址,而有些进程不关心?

基本上,因为严格的客户端(例如Web浏览器)不关心其本地IP地址/端口是什么。通过不要求SOCKET调用来创建/分配地址,它可以允许BIND调用实际上永远不会发生在客户端上下文中(通常无关紧要),而是发生在服务器上下文中(非常重要)。

  

为什么不需要BIND,因为使用的地址对服务器无关紧要?

这与上面答案的第一部分有关。套接字只需要绑定到特定的地址和端口,以便能够伸出一些东西并连接到它。在许多情况下(例如Web浏览器),没有任何理由可以连接到它 - 它只需要能够连接到其他系统(服务器)。

为了使其成为一般原则,您只需要将一个套接字绑定到一个地址,当其他东西需要连接到它时。如果它只连接到其他东西,你不需要BIND一个套接字。