3

背景:

这是第二次调用bind停止我的项目的开发进度。第一次是为任何未知环境选择套接字接口bind是当时的感知错误,其不透明的源代码不允许我看到虚假的 Hyper-V 接口。我实现了 Remy Lebeau 的建议,即使用GetAdaptersAddresses循环通过适配器接口以获得所需的条目。因为我正在创建一个ipv6 slaacIP 地址,所以接下来我实现了 RFC7217。这会产生一个像这样的地址:2600:8806:2700:115:617e:7efc:2e2a:31cc其中的network id前 8 个字节是标准的,来自路由器广告'interface id',后 8 个字节,是 RFC7217 告诉你如何制作的。我能够毫无问题地为创建的地址创建套接字对象。

问题:

但是当我尝试访问bind该地址时,我收到错误WSAEADDRNOTAVAIL (10049)

请求的地址在其上下文中无效。如果 name 参数指向的指定地址不是此计算机上的有效本地 IP 地址,则返回此错误。

间接地,这意味着bind工作。这只是意味着 Windows 以前从未见过该地址,因为它不是由 ISP 提供的。但这就是 SLAAC 地址的本质。

问题:

我应该如何继续,以便 Windows 可以识别我的 slaac 地址,没有它我无法Listen拨打电话?是否有其他人解决了这个问题,也许是另一种方式?

尝试1:

调用CreateUnicastIpAddressEntry。不幸的是,此调用要求应用程序具有管理员权限。我在微软的开发者社区中提出了这个建议: 调用 CreateUnicastIpAddressEntry 函数 as user 而不是 as administrator

编辑1:

我现在已经运行了 MS 示例程序(请参阅Unable to GetUnicastIpAddressEntry after CreateUnicastIpAddressEntry)。这些功能可以工作,但在检索 ipv6 地址时出现问题。成功输入后, bind()仍然不起作用。

编辑2:

进一步的测试表明,Bind()以太网连接仍然失败。请参阅bind() 适用于 ipv6 无线适配器接口,但不适用于 ipv6 以太网(错误 10049)__imp_bind由于微软对未记录函数的黑盒调用,一个简单的调试问题再次变得几乎无法解决。

结论:

ipv6 slaac 地址的网络 ID 通过路由器来自 ISP,因此不是安全威胁。它的接口 id 是不可破解的。该地址不存在安全风险,因此不应受到管理员权限要求的约束。

4

1 回答 1

0

在 CreateUnicastIpAddressEntry 发布后解决Unable to GetUnicastIpAddressEntry的过程中,已验证bind()并且listen()确实可以用于RFC7217 IPv6 SLAAC生成的地址。见其答案。

于 2019-11-17T19:25:31.210 回答