当在同一接口上绑定多个 IPv6 地址时如何将特定 IP 设置为套接字
How to set specific IP to socket when there are multiple IPv6 addresses bound on same interface
我目前正在将一个大型程序从 IPv4 升级到 IPv6。
在执行多个setsockopt
的部分,不知道如何给接口设置具体的源IP。
我这样做是为了设置界面的索引:
setsockopt(m_oClientSocket, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *) &uiInterfaceIndex,
sizeof(uiInterfaceIndex)
如何选择IP?由内核原生 ?
谢谢
如果您想使用特定的源地址,您可以使用 bind()
调用,就像使用 IPv4 一样。
如果要让内核决定使用哪个源地址,请不要使用bind()
或绑定到未指定的地址。这对于 IPv4 也是一样的,但您可能没有注意到,因为您之前没有使用过具有多个 IPv4 地址的系统。它们并不常见,但确实存在 :)
IPv4 的未指定地址是 0.0.0.0
,IPv6 的未指定地址是 ::
。在这两种情况下,它都是“全零”地址。
如果您想了解内核如何选择地址的详细信息,请查看 RFC6724。有很多适用的规则。一开始理解起来可能有点复杂,但是这个想法是内核应该选择一个可以正常工作的地址。
我目前正在将一个大型程序从 IPv4 升级到 IPv6。
在执行多个setsockopt
的部分,不知道如何给接口设置具体的源IP。
我这样做是为了设置界面的索引:
setsockopt(m_oClientSocket, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *) &uiInterfaceIndex,
sizeof(uiInterfaceIndex)
如何选择IP?由内核原生 ?
谢谢
如果您想使用特定的源地址,您可以使用 bind()
调用,就像使用 IPv4 一样。
如果要让内核决定使用哪个源地址,请不要使用bind()
或绑定到未指定的地址。这对于 IPv4 也是一样的,但您可能没有注意到,因为您之前没有使用过具有多个 IPv4 地址的系统。它们并不常见,但确实存在 :)
IPv4 的未指定地址是 0.0.0.0
,IPv6 的未指定地址是 ::
。在这两种情况下,它都是“全零”地址。
如果您想了解内核如何选择地址的详细信息,请查看 RFC6724。有很多适用的规则。一开始理解起来可能有点复杂,但是这个想法是内核应该选择一个可以正常工作的地址。