как привязать локальный адрес ссылки к сокету ipv6 - PullRequest
8 голосов
/ 17 марта 2010

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

Ответы [ 3 ]

11 голосов
/ 19 марта 2010

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

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

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

3 голосов
/ 21 марта 2012

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

if_nametoindex(const char *ifname);
3 голосов
/ 17 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...