背景:
这是第二次调用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,而“接口ID”(后8个字节)是RFC7217告诉您的方法。我可以为创建的地址创建套接字对象,而不会出现问题。
问题:
但是当我尝试bind
地址时,出现错误WSAEADDRNOTAVAIL(10049):
所请求的地址在其上下文中无效。如果name参数所指向的指定地址不是此计算机上的有效本地IP地址,则返回此错误。
间接地,这意味着
bind
正在工作。这只是意味着Windows从未见过该地址,因为ISP没有给出该地址。但这就是SLAAC地址的本质。
问题:
我应该如何进行操作,以使Windows能够识别我的slaac地址,否则我将无法进行Listen
呼叫?还有其他人通过其他方式解决了此问题吗?
Attempt1:
拨打CreateUnicastIpAddressEntry
的电话。不幸的是,此调用要求该应用程序具有administrator特权。我在Microsoft开发人员社区中提出了以下建议:以用户身份而不是以管理员身份调用CreateUnicastIpAddressEntry函数。Edit1:
我现在已经运行了MS示例程序(请参阅Unable to GetUnicastIpAddressEntry after CreateUnicastIpAddressEntry)。这些功能可以正常工作,但是在检索ipv6 addr时出现问题。 bind()
在成功输入后仍然不起作用。结论:
一个ipv6 slaac地址的网络ID来自ISP,它通过路由器来自ISP,因此这不是安全威胁。其接口ID不可破解。该地址不存在安全风险,因此不应受到管理员特权的限制。
背景:这是绑定调用第二次停止我项目的开发进度。第一次是为任何未知环境选择套接字接口。然后,bind是感知到的错误,...
在解决Unable to GetUnicastIpAddressEntry after CreateUnicastIpAddressEntry过帐的过程中,已验证bind()
和listen()
确实可以用于RFC7217 IPv6 SLAAC生成的地址。参见答案。