涉及多个网卡时的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地址的主要内容,如果未能解决你的问题,请参考以下文章