当我在阅读如何在C中建立TCP客户端/服务器连接时,我对bind()函数有疑问。
我读到你需要这个函数将你创建的套接字“绑定”到本地IPEndPoint,因为客户端/服务器连接采用 LocalIP制作的套接字对: LocalPort,RemoteIP:RemotePort 。因此我的问题是:
当客户端不调用bind()时会发生什么以及内核会做什么,但在创建套接字后立即调用connect()(这是常见的事情;我在客户端程序中也这样做,但我不明白为什么我不需要绑定)?
......最重要的是......
为什么服务器程序调用bind(),将INADDR_ANY指定为LocalIP地址?我读到这个常量对于指定通用IP地址很有用,即服务器从Internet上的任何地方接受数据。但是......这是本地IP地址的规范,还是表明客户端可以到达服务器的位置?我变得非常困惑......
答案 0 :(得分:4)
当客户端没有调用bind()时会发生什么以及内核会做什么,但是在创建套接字后立即调用connect()(这是常见的事情;我在客户端程序中也这样做,但是我不明白为什么我不需要绑定??
当您在没有先将套接字绑定到IP /端口的情况下进行出站连接时,内核将根据路由表以及可用的端口自动选择源IP和端口。
为什么服务器程序调用bind(),将INADDR_ANY指定为LocalIP地址?我读到这个常量对于指定通用IP地址很有用,即服务器从Internet上的任何地方接受数据。但是......这是本地IP地址的规范,还是表明客户端可以到达服务器的位置?我变得很困惑......
您所阅读的内容不准确 - 传递给bind()
的sockaddr中的IP地址并未指示服务器将从接受连接的位置。它指示套接字应附加到的本地IP地址。 INADDR_ANY表示您要在连接到计算机的任何和所有IP地址上侦听指定端口上的连接。在具有多个IP地址的服务器上,为bind()
指定一个IP地址通常很有用,这样其他套接字就可以绑定到其他IP上的同一端口。仅绑定到localhost上的端口通常也很有用。
答案 1 :(得分:3)
1)如果要创建服务器套接字,通常只需要调用Bind。在某些情况下,需要建立客户端套接字,但通常情况下,客户端套接字不需要。如果要等待某个端口上的传入连接,则必须绑定它。如果要连接到某些IP和端口,则无需绑定。服务器套接字的绑定采用对TCP端口的独占访问。在您关闭应用程序或关闭套接字之前,没有其他任何东西可以联机并绑定到该端口。
2)您正在指定本地计算机上要绑定的IP。一台计算机可以有多个IP地址。您的计算机可能具有有线和无线连接。每个都在本地网络上有自己的IP。您可以专门绑定到其中一个IP而不是另一个IP。您甚至可以将一个应用程序绑定到一个IP上的端口473(例如),将另一个应用程序绑定到另一个IP上的端口473。如果指定INADDR_ANY,则绑定到计算机具有的所有有效IP。因此,无论客户端使用什么IP都无关紧要,它都会起作用。