5

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

我读到您需要此函数将您创建的套接字“绑定”到本地 IPEndPoint,因为客户端/服务器连接需要一个套接字对,由LocalIP:LocalPort, RemoteIP:RemotePort 创建。因此我的问题是:

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

    ……最重要的是……

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

4

2 回答 2

4

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

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

于 2012-05-12T16:22:52.253 回答
4

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

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

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

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

于 2012-05-12T16:35:10.043 回答