Подтвердить что ты не робот

Добавление поддержки 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, так как значение достаточно хорошее.

4b9b3361

Ответ 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.