背景
在程序的开头,我使用GetAdaptersAddresses构建了适配器接口地址的链接列表。稍后,在创建ipv6 slaac
地址之后,在Socket()
为无线(即Bind()
)的情况下,调用Listen()
,IfType
和IfType
都将成功71(IF_TYPE_IEEE80211
)。我的过滤器参数为family
和ifType
。我通过连接和断开以太网电缆进行测试。对于每种情况,我的软件都会找到具有上述参数的活动接口:已连接它会先找到以太网,断开连接会不会找到以太网,然后再寻找无线接口。有关相关代码段,请参见SO Unable to GetUnicastIpAddressEntry after CreateUnicastIpAddressEntry。
问题
但是,如果接口的IfType
为6(IF_TYPE_ETHERNET_CSMACD
),则Socket()
成功,但是Bind()
当然是Listen()
然后失败。
问题
我是否还有其他因素或接口参数可以确定结果?
Attempt1
循环遍历所有ipv6接口只是为了凭经验确定是否会成功。在两台机器上都没有。
Attempt2
寻找scope id
并将其附加到地址,但是,我在接口链接列表中没有看到scope id
参数。
答案 0 :(得分:0)
Attempt3
如果在调用InitializeUnicastIpAddressEntry之后和调用{{之前}Bind()
未设置为ipRow.DadState
,则 IpDadStatePreferred
将无法在内部表中输入IP地址。 3}}:
ipRow.DadState = IpDadStatePreferred; // RT:191204: beginning with windows 10, this results in 'preferred' instead of 'tentative'
这导致绑定到preferred
套接字,可以在其上成功调用Listen()
。
以下是CreateUnicastIpAddressEntry
中的不正确的文档摘要:
如果DadState成员的值返回的值不是 IpDadStatePreferred或IpDadStateTentative,重复的地址 检测失败,并且IP地址不可用。
如果返回的DadState
是IpDadStateTentative
,则该地址也不可用。
还有这个:
该组织的
DadState
,ScopeId
和CreationTimeStamp
成员 Row参数指向的MIB_UNICASTIPADDRESS_ROW
结构 调用CreateUnicastIpAddressEntry
函数时将被忽略。
DadState
不会被忽略,并且如前所述,如果未将其设置为“ preferred”,则会导致一个非首选的,无法使用的地址。