将 ipv6 slaac 地址绑定到 windows IP 堆栈错误 10049
Binding an ipv6 slaac address to windows IP Stack error 10049
背景:
这是第二次调用 bind
停止了我项目的开发进度。第一次是Selecting a socket interface for any unknown environment. bind
was the perceived fault then, its opaque source code not allowing me to see the spurious Hyper-V interface. I implemented Remy Lebeau's suggestion of using GetAdaptersAddresses to cycle through the adapter interfaces to get the desired entry. Since I am creating an ipv6 slaac
ip address, I next implemented RFC7217. This produces an address like this: 2600:8806:2700:115:617e:7efc:2e2a:31cc
where the network id
, the first 8 bytes, is standard and comes from the Router Advertisement,后面的'interface id',后面的8个字节,是RFC7217告诉你怎么做的。我能够毫无问题地为创建的地址创建套接字对象。
问题:
但是当我尝试 bind
地址时,出现错误 WSAEADDRNOTAVAIL (10049):
The requested address is not valid in its context. This error is returned if the specified address pointed to by the name parameter is not a valid local IP address on this computer.
间接地,这意味着 bind
正在工作。这只是意味着 windows 以前从未见过该地址,因为它不是由 ISP 提供的。但这正是 SLAAC 地址的本质。
问题:
我应该如何进行才能使 windows 能够识别我的 slaac 地址,没有它我就无法拨打 Listen
电话?有没有其他人解决过这个问题,也许是另一种方式?
尝试 1:
调用 CreateUnicastIpAddressEntry。不幸的是,此调用要求应用程序具有 管理员 权限。我在 Microsoft 的开发人员社区中建议这样做:以用户而不是管理员身份调用 CreateUnicastIpAddressEntry 函数。
编辑1:
我现在 运行 MS 示例程序(参见 )。这些功能有效,但在检索 ipv6 地址时出现问题。 bind()进入成功后还是不行
编辑2:
进一步测试显示 Bind()
仍然无法连接以太网。参见 。由于 Microsoft 对未记录的 __imp_bind
函数的黑盒调用,一个简单的调试问题再次变得几乎无法克服。
结论:
ipv6 slaac 地址的网络 ID 通过路由器来自 ISP,因此不是安全威胁。它的接口 ID 是不可破解的。该地址不存在安全风险,因此不应满足管理员权限要求。
正在解析 posting, it was verified that bind()
and listen()
can indeed be made to work for RFC7217 IPv6 SLAAC 个生成的地址。查看它的答案。
背景:
这是第二次调用 bind
停止了我项目的开发进度。第一次是Selecting a socket interface for any unknown environment. bind
was the perceived fault then, its opaque source code not allowing me to see the spurious Hyper-V interface. I implemented Remy Lebeau's suggestion of using GetAdaptersAddresses to cycle through the adapter interfaces to get the desired entry. Since I am creating an ipv6 slaac
ip address, I next implemented RFC7217. This produces an address like this: 2600:8806:2700:115:617e:7efc:2e2a:31cc
where the network id
, the first 8 bytes, is standard and comes from the Router Advertisement,后面的'interface id',后面的8个字节,是RFC7217告诉你怎么做的。我能够毫无问题地为创建的地址创建套接字对象。
问题:
但是当我尝试 bind
地址时,出现错误 WSAEADDRNOTAVAIL (10049):
The requested address is not valid in its context. This error is returned if the specified address pointed to by the name parameter is not a valid local IP address on this computer.
间接地,这意味着 bind
正在工作。这只是意味着 windows 以前从未见过该地址,因为它不是由 ISP 提供的。但这正是 SLAAC 地址的本质。
问题:
我应该如何进行才能使 windows 能够识别我的 slaac 地址,没有它我就无法拨打 Listen
电话?有没有其他人解决过这个问题,也许是另一种方式?
尝试 1:
调用 CreateUnicastIpAddressEntry。不幸的是,此调用要求应用程序具有 管理员 权限。我在 Microsoft 的开发人员社区中建议这样做:以用户而不是管理员身份调用 CreateUnicastIpAddressEntry 函数。
编辑1:
我现在 运行 MS 示例程序(参见
编辑2:
进一步测试显示 Bind()
仍然无法连接以太网。参见 __imp_bind
函数的黑盒调用,一个简单的调试问题再次变得几乎无法克服。
结论:
ipv6 slaac 地址的网络 ID 通过路由器来自 ISP,因此不是安全威胁。它的接口 ID 是不可破解的。该地址不存在安全风险,因此不应满足管理员权限要求。
正在解析 bind()
and listen()
can indeed be made to work for RFC7217 IPv6 SLAAC 个生成的地址。查看它的答案。