涉及多个网卡时的IP地址

Posted

技术标签:

【中文标题】涉及多个网卡时的IP地址【英文标题】:IP Address when Multiple NICs are Involved 【发布时间】: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() 吗?如果他没有,我是否会认为他是从任一地址连接的(不知道是哪个地址)?

【问题讨论】:

INADDR_ANY 将绑定到两个 NIC,因此只要您没有其他套接字已经在侦听(或将尝试侦听)到另一个 IP 上的同一端口,您就可以使用 INADDR_ANY来源:cs.cmu.edu/~srini/15-441/F01.full/www/assignments/P2/… 【参考方案1】:

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

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

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

【讨论】:

以上是关于涉及多个网卡时的IP地址的主要内容,如果未能解决你的问题,请参考以下文章

一个网卡设置多个IP地址的方法是啥?

linux配置ip地址多网卡绑定单网卡多个ip

linux下一块网卡设置多个ip地址

如何取消同个网卡上设置有多个IP

Ubuntu为网卡添加多个IP地址

ip---给网卡配置多个IP地址(别名)以及删除