bind()适用于ipv6无线适配器接口,但不适用于ipv6以太网(错误10049)

时间:2019-12-02 22:37:47

标签: bind ip-address ipv6 unicast windows-socket-api

背景

在程序的开头,我使用GetAdaptersAddresses构建了适配器接口地址的链接列表。稍后,在创建ipv6 slaac地址之后,在Socket()为无线(即Bind())的情况下,调用Listen()IfTypeIfType都将成功71(IF_TYPE_IEEE80211)。我的过滤器参数为familyifType。我通过连接和断开以太网电缆进行测试。对于每种情况,我的软件都会找到具有上述参数的活动接口:已连接它会先找到以太网,断开连接会不会找到以太网,然后再寻找无线接口。有关相关代码段,请参见SO Unable to GetUnicastIpAddressEntry after CreateUnicastIpAddressEntry

问题

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

问题

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

Attempt1

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

Attempt2

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

1 个答案:

答案 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地址不可用。

如果返回的DadStateIpDadStateTentative,则该地址也不可用。

还有这个:

  

该组织的DadStateScopeIdCreationTimeStamp成员   Row参数指向的MIB_UNICASTIPADDRESS_ROW结构   调用CreateUnicastIpAddressEntry函数时将被忽略。

DadState不会被忽略,并且如前所述,如果未将其设置为“ preferred”,则会导致一个非首选的,无法使用的地址。