【问题标题】:IP Address when Multiple NICs are Involved涉及多个网卡时的IP地址
【发布时间】:2012-03-15 19:34:02
【问题描述】:

我正在使用 Winsock 编写一个 TCP 服务器应用程序。我的服务器将在其上运行的机器和客户端将在其上运行的机器都有 2 个 NIC。涉及的IP地址是:

  • 服务器网卡1:192.168.132.14
  • 服务器网卡 2:192.168.132.15
  • 客户端网卡 1:192.168.132.16
  • 客户端网卡 2:192.168.132.17

问题 1: 在我的服务器应用程序中,如果我在绑定我的侦听套接字时使用 INADDR_ANY,我的两个 IP 地址中的哪一个将被使用?我是否正确地假设没有任何信息并且我应该使用 inet_addr("192.168.132.14") 代替 INADDR_ANY?

问题 2: 客户端连接我时如何控制他使用的 IP 地址?他会在调用 connect() 之前简单地调用 bind() 吗?如果他没有,我是否会认为他是从任一地址连接的(不知道是哪个地址)?

【问题讨论】:

标签: tcp winsock


【解决方案1】:

在服务器套接字上调用listen() 时,绑定到INADDR_ANY 会将套接字绑定到机器上所有可用的本地IP。这允许客户端连接到任何服务器的 IP。如果服务器改用inet_addr(),那将是服务器可以接受客户端连接的唯一IP。

在客户端套接字上调用connect() 时,它必须指示服务器正在侦听的特定IP。如果客户端想要为其连接的端点选择它绑定到的本地 IP,它可以在调用 connect() 之前对自己调用 bind()。如果客户端未绑定到特定 IP,或者绑定到 INADDR_ANY,则套接字将使用它找到的第一个 IP,该 IP 具有到正在连接的服务器 IP 的可用路由。

一旦建立连接,双方就可以随时在各自的套接字端点上调用getsockname()getpeername(),以发现实际用于该连接的IP(和端口)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2018-03-24
    • 2013-11-15
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    相关资源
    最近更新 更多