【问题标题】:address questions in Socket programming解决 Socket 编程中的问题
【发布时间】:2015-10-08 04:41:47
【问题描述】:

从 Tanenbaum 的计算机网络中对 Berkeley Sockets API 的介绍,

  1. 在服务器端:

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

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

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

  2. 在客户端:

    现在让我们看看客户端。在这里,也必须首先是一个套接字 使用SOCKET 原语创建,但不需要BIND,因为 使用的地址与服务器无关。

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

【问题讨论】:

    标签: sockets network-programming


    【解决方案1】:

    为什么不让 SOCKET 调用直接创建地址,因为有些进程关心它们的地址,而另一些则不关心?

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

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

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

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

    【讨论】:

    • 谢谢。客户端不需要有自己的地址,那么服务器如何找到客户端返回客户端请求的东西?
    • 客户端确实需要自己的地址,但不需要任何特定的地址。当客户端尝试连接到服务器时,其 TCP/IP 堆栈将在那时确定最佳 IP 地址和要绑定到的空闲 TCP 端口。所以客户仍然得到一个地址,但不是它关心的地址。
    【解决方案2】:

    为什么不让 SOCKET 调用直接创建地址,因为有些进程关心它们的地址,而另一些则不关心?

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

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

    我不同意这种奇怪的说法。

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

    这是另一个奇怪的表述。连接套接字的源地址可以通过静态 IP 路由表自动确定。只要客户端完全可以连接到服务器,对称性保证服务器可以在同一连接上发送回客户端,因此客户端的实际源地址对于客户端或服务器都无关紧要应用。 TCP当然很重要,否则就不存在了。

    【讨论】:

    • 谢谢。客户端不需要有自己的地址,那么服务器如何找到客户端返回客户端请求的东西?
    猜你喜欢
    • 2017-01-29
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2011-09-02
    • 2012-02-11
    • 2011-02-02
    相关资源
    最近更新 更多