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

问题描述 投票:0回答:1

背景

在程序的开头,我使用GetAdaptersAddresses建立了适配器接口地址的链表。稍后,在创建ipv6 slaac地址之后,在Socket()为无线(即Bind() 71(Listen()))的情况下,调用IfTypeIfTypeIF_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参数。

bind ip-address ipv6 unicast windows-socket-api
1个回答
0
投票

Attempt3

如果在调用Bind()之后但调用ipRow.DadState之前未将IpDadStatePreferred设置为InitializeUnicastIpAddressEntry,则[CreateUnicastIpAddressEntry将无法在内部表中输入IP地址:

ipRow.DadState = IpDadStatePreferred; // RT:191204: beginning with windows 10, this results in 'preferred' instead of 'tentative'

这将绑定到可以成功调用preferredListen()套接字。

这里是CreateUnicastIpAddressEntry中不正确的文档摘要:

如果DadState成员的值返回的值不是IpDadStatePreferred或IpDadStateTentative,重复的地址检测失败,并且IP地址不可用。

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

也有这个:

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

DadState不会被忽略,并且如前所述,将导致一个非首选的,不可使用的地址。

© www.soinside.com 2019 - 2024. All rights reserved.