将 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 个生成的地址。查看它的答案。