Этот вопрос можно рассматривать как вопрос о сестре предыдущего, отправленного один. Это очень утомительно, что, когда Вы хотите связать ссылку локальный адрес с сокетом IPv6, необходимо установить sin6_scope_id
поле sockaddr_in6
структура. Я задаюсь вопросом, может ли кто-то предоставить решение после хорошей практики.
Локальный адрес канала IPv6 не уникален на узле, он уникален только для сетевой карты, поэтому вам необходимо указать идентификатор области. Другими словами, вполне допустимо иметь несколько адаптеров с одним и тем же IPv6-адресом.
Это означает, что вы должны принять в качестве входных данных идентификатор области действия или подходящую текстовую форму (% eth0,% 1), которую вы можете передать в getaddrinfo ()
.
Один из методов состоит в том, чтобы взять локальный адрес канала IPv6, перечислить интерфейсы, и если только один соответствует, использовать его, если более одного совпадения, то выйдите со списком интерфейсов и попросите пользователя указать, какой из них полностью форма.
Проблема возникает только при жестком кодировании локального адреса ссылки, что не является практическим решением для нетривиального приложения.
В противном случае вы должны получить свой sockaddr
для привязки из getifaddrs ()
, который заполнит идентификатор области для вас (например, вы можете разрешить своему пользователю указать имя интерфейса, затем выполните поиск в списке, возвращаемом getifaddrs ()
, чтобы найти локальный адрес ссылки, связанный с этим интерфейсом).