Добавлена ​​поддержка IPv6 в клиент-серверных приложениях IPv4 - поля sin6_flowinfo и sin6_scope_id? - PullRequest
22 голосов
/ 24 ноября 2011

Я работаю над реализацией поддержки IPv6 для нескольких приложений, но мне было интересно, для чего нужны эти 2 поля.Здесь так мало вопросов об этом, поэтому я не уверен, что понял правильно.

  • Об идентификаторе области (sin6_scope_id) - ну, Q1 , Q2 , Q3 и Q4 дал мне представление об идентификаторе области, и я думаю, что получаю его.Итак, мне нужно добавить еще один параметр конфигурации, чтобы сделать настраиваемый идентификатор области.(Я решил добавить это здесь, на случай, если кто-то заинтересован в этом).Вкратце - идентификатор области видимости необходим для однозначного определения устройства, которое должно обрабатывать трафик, поскольку может быть несколько интерфейсов с одинаковым IP-адресом, но с разными идентификаторами (интерфейс?).Пока все хорошо.
  • Но как насчет "информации о потоке" (sin6_flowinfo)
    • Для чего она нужна?Я не мог найти ничего интересного об этом.Я прочитал RFC , но это мне совсем не помогло.
    • Существуют ли возможные значения для sin6_flowinfo (например, несколько значений, например, флаги, которые что-то значат), или это похоже на sin6_scope_id - может быть любое значение, в зависимости от устройства, япытаться подключиться к?
    • Должен ли я вообще волноваться об этом, или я просто оставляю это 0 (как в Руководство по сетевому программированию Beej . И да , Я пытался, это работает, но я не уверен, работает ли он только в этом случае (если это зависит от конфигурации сети), или он всегда будет работать, если он установлен на 0?
    • Или, может быть, я должен сделать его настраиваемым, я имею в виду - добавить еще один параметр конфигурации и позволить пользователю определить его значение?
    • google -ing "sin6_flowinfo" дает мне определения структуры и страницы руководства,ничего полезного об этом поле. Любой интересный источник? (понятно ... не RFC: D)

РЕДАКТИРОВАТЬ : Ну, после ответа @glglgl и после подсказки, что sin6_flowinfo может быть устаревшим, я нашел некоторые интересные, такurces: RFC: спецификация метки потока IPv6 , Черновик IETF: метка потока как одноразовый номер транспортного уровня , Практическое руководство по солярису и Википедия .
Поле не устарело (или я не смог найти такой источник, который подтверждает это), но оновыглядит как 0, так как значение достаточно хорошее.

1 Ответ

6 голосов
/ 24 ноября 2011

Лучший способ - использовать 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.

...