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
не игнорируется и, как указывалось ранее, приведет к нежелательному, неиспользуемому адресу, если не установлен как предпочтительный.