【发布时间】:2020-02-27 23:33:21
【问题描述】:
背景:
这是第二次调用bind 停止我的项目的开发进度。第一次是Selecting a socket interface for any unknown environment。 bind 是当时的感知错误,其不透明的源代码不允许我看到虚假的 Hyper-V 接口。我实施了 Remy Lebeau 的建议,即使用 GetAdaptersAddresses 循环通过适配器接口以获得所需的条目。因为我正在创建一个ipv6 slaac ip 地址,所以接下来我实现了RFC7217。这会产生一个像这样的地址:2600:8806:2700:115:617e:7efc:2e2a:31cc 其中network id,前 8 个字节,是标准的,来自Router Advertisement,而后 8 个字节的“接口 id”是 RFC7217 告诉你如何制作的.我可以毫无问题地为创建的地址创建套接字对象。
问题:
但是当我尝试bind 地址时,我收到错误WSAEADDRNOTAVAIL (10049):
请求的地址在其上下文中无效。如果 name 参数指向的指定地址不是此计算机上的有效本地 IP 地址,则返回此错误。
间接地,这意味着bind 正在工作。这只是意味着 Windows 以前从未见过该地址,因为它不是由 ISP 提供的。但这就是 SLAAC 地址的本质。
问题:
我应该如何继续,以便 Windows 可以识别我的 slaac 地址,否则我无法拨打Listen 电话?是否有其他人解决了这个问题,也许是另一种方式?
尝试1:
调用 CreateUnicastIpAddressEntry。不幸的是,此调用要求应用程序具有 administrator 权限。我在 Microsoft 的开发者社区中建议:以用户而不是管理员身份调用 CreateUnicastIpAddressEntry 函数。
编辑1:
我现在已经运行了 MS 示例程序(请参阅 Unable to GetUnicastIpAddressEntry after CreateUnicastIpAddressEntry)。这些功能可以工作,但在检索 ipv6 地址时出现问题。 bind()进入成功后仍然不起作用。
编辑2:
进一步的测试表明Bind() 仍然无法进行以太网连接。见bind() works for ipv6 wireless adapter interface but not for ipv6 ethernet (error 10049)。由于 Microsoft 对未记录的 __imp_bind 函数的黑盒调用,一个简单的调试问题再次变得几乎无法解决。
结论:
ipv6 slaac 地址的网络 ID 通过路由器来自 ISP,因此不构成安全威胁。它的接口 id 是不可破解的。该地址不存在安全风险,因此不应受到管理员权限要求的约束。
【问题讨论】:
-
请显示相关代码并说明确切的问题或错误。仅有描述是不够的。另见How to create a Minimal, Complete, and Verifiable example。
-
相关代码见 SO
Unable to GetUnicastIpAddressEntry after CreateUnicastIpAddressEntryEdit1。 -
这个 SO 发帖
Bind() Windows Socket works with IPv4 but not with IPv6提出的问题与这个发帖基本相同,不同之处在于,其他发帖使用::1和getaddrinfo()来解析IP 地址。不幸的是,这种方法使用 DNS 解析地址。相比之下,这篇文章的方法是使用 RFC7217 自行创建 IP 地址。这意味着 IP 地址已经被解析,因为您是创建它的人。 DNS 传统上存在安全问题,尽管 DOH 正在尝试解决此问题。使用 RFC7217 通过设计消除了这个安全漏洞。
标签: bind ipv6 windows-socket-api