背景
在程序的开头,我使用GetAdaptersAddresses建立了适配器接口地址的链表。稍后,在创建ipv6 slaac
地址之后,在Socket()
为无线(即Bind()
71(Listen()
))的情况下,调用IfType
,IfType
和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
参数。
Attempt3
如果在调用Bind()
之后但调用ipRow.DadState
之前未将IpDadStatePreferred
设置为InitializeUnicastIpAddressEntry,则[CreateUnicastIpAddressEntry将无法在内部表中输入IP地址:
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
不会被忽略,并且如前所述,将导致一个非首选的,不可使用的地址。