【问题标题】:Clarity on bind() socket function明确绑定()套接字函数
【发布时间】:2012-05-13 12:06:00
【问题描述】:

在阅读如何在 C 中建立 TCP 客户端/服务器连接时,我对 bind() 函数有疑问。

我了解到您需要此函数将您创建的套接字“绑定”到本地 IPEndPoint,因为客户端/服务器连接采用 套接字对,由 LocalIP 创建: LocalPort、RemoteIP:远程端口。因此我的问题是:

  1. 当客户端不调用 bind(),但在创建套接字后立即调用 connect() 时会发生什么以及内核会做什么(这是常见的事情;我也在客户端程序中这样做,但我不明白为什么我不需要绑定)?

    ...最重要的是...

  2. 为什么服务器程序调用 bind(),将 INADDR_ANY 指定为 LocalIP 地址?我读到这个常量对于指定一个通用 IP 地址很有用,即服务器接受来自 Internet 上任何地方的数据。但是...这是本地 IP 地址的规范,还是表明客户端可以到达服务器的位置?我越来越糊涂了……

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    1) 如果要创建服务器套接字,通常只需要调用 Bind。在某些情况下需要建立客户端套接字,但通常不需要客户端套接字。如果要等待某个端口上的传入连接,则必须绑定到它。如果您想连接到某个 IP 和端口,则无需绑定。服务器套接字的绑定对 TCP 端口进行独占访问。在您的应用程序关闭或套接字被您关闭之前,没有其他东西可以联机并绑定到该端口。

    2) 您正在指定要绑定到本地计算机上的哪个 IP。一台计算机可以有多个 IP 地址。您的计算机可能具有有线和无线连接。每个在本地网络上都有自己的 IP。您可以专门绑定到其中一个 IP,而不是另一个。您甚至可以将一个应用程序绑定到一个 IP 上的端口 473(例如),而将一个完全不同的应用程序绑定到另一个 IP 上的端口 473。如果您指定 INADDR_ANY,您将绑定到机器拥有的所有有效 IP。因此,无论客户端使用什么 IP 获取您,它都会起作用。

    【讨论】:

    • Referring 1, "Nothing else can [...] bind to that port until your application closes.": 如果应用程序的套接字是close()d,该端口可供任何人免费重复使用,尽管该应用程序仍在运行。当应用程序终止时,内核会 close() 任何应用程序的套接字。
    • 同意,我将其添加到我的答案中
    • 你完全可以调用 bind 然后连接。例如,FTP 服务器会这样做,以确保它们从 端口 20 连接。虽然这不是一种常见的用法,但我会同意你的。
    • 客户致电bind() 并不少见。这是完全有效的。例如,当通过具有限制性安全规则的防火墙/路由器进行传出连接时,有时您必须绑定到一组允许的端口。
    【解决方案2】:

    当客户端不调用 bind() 而是在创建套接字后立即调用 connect() 时会发生什么以及内核会做什么(这是常见的事情;我也在客户端程序中这样做,但我不明白为什么我不需要绑定)?

    当您在没有先将套接字绑定到 IP/端口的情况下进行出站连接时,内核将根据路由表和可用端口自动选择源 IP 和端口。

    为什么服务器程序调用 bind(),将 INADDR_ANY 指定为 LocalIP 地址?我读到这个常量对于指定一个通用 IP 地址很有用,即服务器接受来自 Internet 上任何地方的数据。但是...这是本地 IP 地址的规范,还是表明客户端可以到达服务器的位置?我越来越糊涂了……

    您阅读的内容不准确 - sockaddr 中传递给 bind() 的 IP 地址并未指示服务器将接受来自哪里的连接。它指示套接字应附加到的本地 IP 地址。 INADDR_ANY 表示您希望在连接到机器的任何和所有 IP 地址上的指定端口上侦听连接。在具有多个 IP 地址的服务器上,将一个 IP 地址指定给bind() 往往很有用,这样其他套接字就可以绑定到其他 IP 上的同一端口。仅绑定到 localhost 上的端口通常也很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-13
      • 2019-02-04
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      相关资源
      最近更新 更多