Добавление поддержки IPv6 в клиентских/серверных приложениях IPv4 - поля sin6_flowinfo и sin6_scope_id?
Я работаю над реализацией поддержки IPv6 для нескольких приложений, но мне было интересно, для чего нужны эти 2 поля. Здесь так мало вопросов, так что я не уверен, что понял правильно.
- Об идентификаторе области (
sin6_scope_id
) - ну, Q1, Q2, Q3 и Q4 дали мне Идея об объеме ID и я думаю, что я понимаю. Итак, мне нужно добавить еще один параметр конфигурации, чтобы сделать настраиваемый идентификатор области. (Я решил добавить это здесь, на случай, если кто-то заинтересован в этом). Вкратце - идентификатор области видимости необходим для однозначного определения устройства, которое должно обрабатывать трафик, поскольку может быть несколько интерфейсов с одинаковым IP-адресом, но с разными идентификаторами (интерфейс?). Пока все хорошо.
- Но как насчет "информации о потоке" (
sin6_flowinfo
)
- Для чего это? Я не мог найти ничего интересного об этом. Я прочитал RFC, но это мне совсем не помогло.
- Существуют ли возможные значения для
sin6_flowinfo
(например, несколько значений, например, флаги, которые что-то значат), или, например, sin6_scope_id
- это может быть любое значение, в зависимости от устройства, к которому я пытаюсь подключиться?
- Должен ли я вообще об этом беспокоиться или я просто оставлю это
0
(как в Руководстве по сетевому программированию Beaj. И да, я пробовал это, это работает, но я не уверен, что это так. работает только в этом случае (если это зависит от какой-либо конфигурации сети) или будет работать всегда, если установлено 0
?
- Или, может быть, я должен сделать его настраиваемым, я имею в виду - добавить еще один параметр конфигурации и позволить пользователю определить его значение?
google
-ing "sin6_flowinfo" дает мне определения структуры и страницы руководства, ничего полезного об этом поле. Любой интересный источник? (понятно.. не RFC: D)
РЕДАКТИРОВАТЬ: Ну, после ответа @glglgl и после подсказки, что sin6_flowinfo
может устареть, я нашел несколько интересных источников: RFC: спецификация метки потока IPv6, черновик IETF: поток Пометьте его как Nonce транспортного уровня, Практическое руководство по солярису и википедии.
Поле не устарело (или я не смог найти такой источник, который подтверждает это), но выглядит как 0
, так как значение достаточно хорошее.
Ответы
Ответ 1
Лучше всего использовать getaddrinfo()
.
Псевдокод:
struct addrinfo *restrict hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM };
struct addrinfo * res, r;
if (0 == getaddrinfo("foo.bar.baz", "http", &hints, &res)) {
for (r=res; r; r=r->ai_next) {
sock = socket(r->ai_family, r->ai_socktype, r->ai_protocol);
connect(sock, r->ai_addr, r->ai_addrlen);
if error: continue
break
}
}
freeaddrinfo(res);
Это беспокоит вас от sin6_scope_id
; обычно 0
, за исключением случаев, когда у вас есть локальные адреса ссылок, например fe80::1234:56ff:fe78:9abc%eth2
. Этот eth2
преобразуется в правильный идентификатор области.
sin6_flowinfo
является устаревшим (AFAIK) и поэтому устанавливается в 0 в полученном struct addrinfo
ai_addr
.