背景:
这是第二次给bind的电话已经停止了我的项目的开发进度。第一次是为任何未知环境选择套接字接口。bind是当时被感知到的错误,它的不透明源代码不允许我看到虚假的超级V接口。我实现了Remy的建议,即使用GetAdaptersAddresses循环适配器接口以获得所需的条目。因为我要创建一个ipv6 slaac ip地址,所以接下来我实现了RFC7217。这产生了这样一个地址:2600:8806:2700:115:617e:7efc:2e2a:31cc,network id,前8个字节,是标准的,来自于路由器广告,而‘接口id’(后8个字节)是RFC7217告诉您如何制作的。我能够为创建的地址创建套接字对象,没有问题。
问题:
但是当我尝试bind地址时,我得到了错误WSAEADDRNOTAVAIL (10049)
请求的地址在其上下文中无效。如果name参数指向的指定地址不是此计算机上的有效本地IP地址,则返回此错误。
间接而言,这意味着bind正在工作。这仅仅意味着windows以前从未见过这个地址,因为它不是由ISP提供的。但这正是SLAAC地址的本质。
问题:
我应该如何进行,以便windows能够识别我的slaac地址,没有这个地址我就不能打Listen电话了?有没有其他人已经解决了这个问题,也许是另一种方式?
Attempt1:
给CreateUnicastIpAddressEntry.打个电话不幸的是,此调用要求应用程序具有管理员权限。我在微软的Developer中建议这样做:将CreateUnicastIpAddressEntry函数称为用户,而不是管理员。
Edit1:
我现在已经运行了MS示例程序(请参阅无法GetUnicastIpAddressEntry后CreateUnicastIpAddressEntry)。函数可以工作,但是在检索ipv6 addr时有一个问题。bind()在成功的条目之后仍然不能工作。
Edit2:
进一步的测试表明,Bind()在以太网连接方面仍然失败。见bind()适用于ipv6无线适配器接口,但不适用于ipv6以太网(错误10049)。再一次,由于微软对无文档的__imp_bind函数的黑匣子调用,一个简单的调试问题实际上变得无法克服。
结论:
ipv6 slaac地址的网络id通过路由器来自ISP,因此不构成安全威胁。它的界面标识是不可裂的。该地址不存在安全风险,因此不应受制于管理员特权要求。
发布于 2019-11-17 19:25:31
在解析无法GetUnicastIpAddressEntry后CreateUnicastIpAddressEntry发布的过程中,验证了bind()和listen()确实可以用于RFC7217 IPv6 SLAAC生成的地址。看看它的答案。
https://stackoverflow.com/questions/58663136
复制相似问题