как привязать локальный адрес ссылки к сокету ipv6

StackOverflow https://stackoverflow.com/questions/2460841

  •  20-09-2019
  •  | 
  •  

Вопрос

Этот вопрос можно рассматривать как родственный вопрос Предыдущая разместил сам.Очень утомительно, когда вы хотите привязать локальный адрес ссылки к сокету IPv6, вам нужно установить sin6_scope_id поле sockaddr_in6 структура.Мне интересно, может ли кто-нибудь предложить решение, следуя передовой практике.

Это было полезно?

Решение

Локальный адрес канала IPv6 не уникален на узле, он уникален только для сетевого адаптера, поэтому вам необходимо указать идентификатор области.Другими словами, вполне допустимо иметь несколько адаптеров с одним и тем же адресом IPv6.

Это означает, что вы должны принять в качестве входных данных идентификатор области или подходящую текстовую форму (%eth0, %1), которую вы можете передать getaddrinfo().

Один из методов состоит в том, чтобы взять локальный адрес канала IPv6, перечислить интерфейсы и, если совпадает только один, использовать его, если совпадений более одного, то выйти из списка интерфейсов и попросить пользователя указать, какой из них в полной форме.

Другие советы

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

В противном случае вы должны получить sockaddr связывать из getifaddrs(), который заполнит для вас идентификатор области (например.вы можете разрешить пользователю указывать имя интерфейса, а затем выполнять поиск по списку, возвращаемому getifaddrs() чтобы найти локальный адрес канала, связанный с этим интерфейсом).

Для локальных адресов канала IPv6 (fe80::/10 префикс), sin6_scope_id член в sockaddr_in6 структура — это номер интерфейса, и вы можете получить этот номер,

if_nametoindex(const char *ifname);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top