【问题标题】:bind() works for ipv6 wireless adapter interface but not for ipv6 ethernet (error 10049)bind() 适用于 ipv6 无线适配器接口,但不适用于 ipv6 以太网(错误 10049)
【发布时间】:2020-03-27 13:59:46
【问题描述】:

背景

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

问题

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

问题

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

尝试1

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

尝试2

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

【问题讨论】:

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


    【解决方案1】:

    尝试3

    如果在调用InitializeUnicastIpAddressEntry之后和调用CreateUnicastIpAddressEntry之前没有将ipRow.DadState设置为IpDadStatePreferredBind()将无法将ip地址输入到内部表中:

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

    这导致绑定到preferred 套接字,在该套接字上可以成功调用Listen()

    这是CreateUnicastIpAddressEntry 中不正确的文档 sn-ps:

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

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

    还有这个:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      相关资源
      最近更新 更多