背景:
这是第二次调用bind
停止我的项目的开发进度。第一次是为任何未知环境选择套接字接口。bind
是当时的感知错误,其不透明的源代码不允许我看到虚假的 Hyper-V 接口。我实现了 Remy Lebeau 的建议,即使用GetAdaptersAddresses循环通过适配器接口以获得所需的条目。因为我正在创建一个ipv6 slaac
IP 地址,所以接下来我实现了 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 是不可破解的。该地址不存在安全风险,因此不应受到管理员权限要求的约束。