bind() работает для интерфейса беспроводного адаптера ipv6, но не для интерфейса ipv6 ethernet (ошибка 10049)

Задний план

В начале своей программы я создаю связанный список адресов интерфейсов адаптера, используя GetAdaptersAddresses. Позже, после созданияipv6 slaac адрес, звонок Socket(), Bind() а также Listen() все преуспевают там, где IfType беспроводной, то есть IfType 71 (IF_TYPE_IEEE80211). Мои параметры фильтраfamily а также ifType. Я тестирую подключением и отключением кабеля Ethernet. В каждом случае мое программное обеспечение находит активный интерфейс с указанными параметрами: при подключении оно сначала находит Ethernet, при отключении не находит Ethernet, а затем ищет беспроводной интерфейс. См. Раздел SO Unable to GetUnicastIpAddressEntry после CreateUnicastIpAddressEntry для получения соответствующих фрагментов кода.

Проблема

Однако если интерфейс IfType равно 6 (IF_TYPE_ETHERNET_CSMACD), Socket() удается, но Bind() и конечно Listen() потом терпит неудачу.

Вопрос

Есть ли какие-то другие факторы или параметры интерфейса, которые я упустил, которые могут определить результат?

Попытка1

Переберите все интерфейсы ipv6, чтобы эмпирически определить, удастся ли какой-либо из них. На двух машинах ничего не делал.

Попытка2

Искал scope id и добавьте это в адрес, однако я не видел scope id параметр в связанном списке интерфейса.

1 ответ

Решение

Попытка3

Bind() не сможет ввести IP-адрес во внутреннюю таблицу, если ipRow.DadState не установлен на IpDadStatePreferredпосле вызова InitializeUnicastIpAddressEntry и перед вызовом CreateUnicastIpAddressEntry:

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 члены MIB_UNICASTIPADDRESS_ROW структура, на которую указывает параметр Row, игнорируется, когда CreateUnicastIpAddressEntry функция вызывается.

DadState не игнорируется и, как указывалось ранее, приведет к нежелательному, неиспользуемому адресу, если не установлен как предпочтительный.

Другие вопросы по тегам