我正在使用Winsock编写TCP服务器应用程序。我的服务器将运行的机器和运行客户端的机器都有2个NIC。涉及的IP地址是:
问题1: 在我的服务器应用程序中,如果在绑定我的侦听套接字时使用INADDR_ANY,将使用我的两个IP地址中的哪一个?我是否正确地假设没有说明,我应该使用inet_addr(“192.168.132.14”)代替INADDR_ANY?
问题2: 客户端如何控制连接到我时使用的IP地址?他会在调用connect()之前调用bind()吗?我是否有责任将他视为从任何一个地址连接(不知道哪一个),如果他不这样做?
答案 0 :(得分:7)
在服务器套接字上调用listen()
时,绑定到INADDR_ANY
会将套接字绑定到计算机上的所有可用本地IP。这允许客户端连接到任何服务器的IP。如果服务器改为使用inet_addr()
,那么这将是服务器可以接受客户端连接的唯一IP。
在客户端套接字上调用connect()
时,必须指明服务器正在侦听的特定IP。如果客户端想要选择它为其连接端点绑定的本地IP,则可以在调用bind()
之前调用connect()
。如果客户端未绑定到特定IP,或绑定到INADDR_ANY
,则套接字将使用它找到的第一个IP,该IP具有到达所连接的服务器IP的可用路由。
建立连接后,双方可以随时在各自的套接字端点上调用getsockname()
和getpeername()
,以发现哪些IP(和端口)实际用于该连接。 / p>