0

背景

在我的程序开始时,我使用GetAdaptersAddresses构建了一个适配器接口地址的链接列表。后来,创建ipv6 slaac地址后,调用Socket()Bind()Listen()成功了,那里IfType是Wireless,也就是IfType71( IF_TYPE_IEEE80211)。我的过滤器参数是familyifType。我通过连接和断开以太网电缆进行测试。对于每种情况,我的软件都会找到具有上述参数的活动接口:连接它首先找到以太网,断开连接它没有找到以太网,然后进一步寻找无线接口。有关相关代码片段,请参阅 CreateUnicastIpAddressEntry 之后的 SO Unable to GetUnicastIpAddressEntry 。

问题

但是,如果接口IfType是 6 ( IF_TYPE_ETHERNET_CSMACD),则Socket()成功,但Bind()当然Listen()会失败。

问题

是否还有其他我遗漏的因素或接口参数可以决定结果?

尝试1

循环遍历所有 ipv6 接口只是为了凭经验确定是否有任何成功。两台机器上都没有。

尝试2

查找scope id并将其附加到地址,但是,我没有scope id在接口链接列表中看到该参数。

4

1 回答 1

0

尝试3

Bind()如果在调用InitializeUnicastIpAddressEntry之后和调用CreateUnicastIpAddressEntryipRow.DadState之前未设置为,则将无法将 ip 地址输入到内部表中:IpDadStatePreferred

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,则地址也不可用。

另外,还有这个:

调用函数时,将忽略 Row 参数指向的结构的DadStateScopeIdCreationTimeStamp成员 。MIB_UNICASTIPADDRESS_ROWCreateUnicastIpAddressEntry

DadState不会被忽略,并且如前所述,如果未设置为首选,则会导致非首选、不可用的地址。

于 2019-12-05T14:09:15.773 回答