Привязка адреса ipv6 slaac к Windows Stack ошибка 10049 - PullRequest
4 голосов
/ 01 ноября 2019

Справочная информация:

Это уже второй раз, когда звонок на bind останавливает прогресс разработки моего проекта. Первый раз был Выбор интерфейса сокета для любой неизвестной среды . bind была тогда воспринятой ошибкой, ее непрозрачный исходный код не позволял мне видеть поддельный интерфейс Hyper-V. Я реализовал предложение Реми Лебо об использовании GetAdaptersAddresses для циклического переключения интерфейсов адаптера для получения желаемой записи. Так как я создаю ipv6 slaac IP-адрес, я затем внедрил RFC7217 . В результате получается адрес, подобный следующему: 2600:8806:2700:115:617e:7efc:2e2a:31cc, где network id, первые 8 байтов, являются стандартными и исходят из Объявление маршрутизатора , а 'interface id', последние 8 байтов, - это то, что RFC7217рассказывает, как сделать. Я могу создать объект сокета для созданного адреса без проблем.

Проблема:

Но когда я пытаюсь bind адрес, я получаю ошибку WSAEADDRNOTAVAIL (10049) :

Запрошенный адрес недопустим в своем контексте. Эта ошибка возвращается, если указанный адрес, на который указывает параметр имени, не является действительным локальным IP-адресом на этом компьютере.

Косвенно это означает, что bind работает. Это просто означает, что окна никогда не видели адрес раньше, так как он не был выдан ISPНо это сама природа адресов SLAAC.

Вопрос:

Как мне поступить, чтобы окна могли распознать мой slaac-адрес, без которого я не могу совершить вызов Listen? Есть кто-то еще, кто работал над этой проблемой, возможно, другим способом?

Попытка 1:

Выполните вызов CreateUnicastIpAddressEntry . К сожалению, этот вызов требует, чтобы приложение имело привилегии Администратор . Я предложил это в сообществе разработчиков Microsoft: вызывать функцию CreateUnicastIpAddressEntry как пользователь, а не как администратор .

Edit1:

Теперь я запустилПримеры программ MS (см. Невозможно получить GetUnicastIpAddressEntry после CreateUnicastIpAddressEntry ). Функции работают, но есть проблема при получении адреса ipv6. bind () после успешной записи по-прежнему не работает.

Вывод:

Сетевой идентификатор ipv6 slaac-адреса поступает от интернет-провайдера черезмаршрутизатор и, следовательно, не является угрозой безопасности. Его идентификатор интерфейса не взломан. Адрес не представляет угрозы безопасности и, следовательно, не должен подвергаться требованию администратора.

...