Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

FF01::43

::1

Если рассмотреть самый крайний случай, то адрес

0:0:0:0:0:0:0:0
превращается просто в выражение
::
[133] .

Последний метод записи IPv6-адресов заключается в том, что последние 32 бита представляются с разделительными точками, а первые 96 битов — с разделительными двоеточиями. При этом адрес обратной связи IPv6

::1
будет записан либо как
::0.0.0.1
, либо как
0:0:0:0:0:0:0.0.0.1
.

133

Это

так называемый неустановленный адрес для IPv6.

IPv6 определяет любой адрес с 96 начальными нулями (за исключением адреса обратной связи и неустановленного адреса) как совместимый IPv4-адрес, который позволяет сетевым маршрутизаторам передавать через сети IPv6 пакеты, предназначенные для IPv4-хостов. Сокращение двоеточий позволяет легко записать IPv4-адрес как IPv6-адрес путем добавления

::
перед стандартным десятичным адресом с точками. Такой тип адресов называется IPv4-совместимым IPv6-адресом. Такая адресация применяется только маршрутизаторами; обычные программы не могут воспользоваться ее преимуществами.

Программы, работающие на машинах IPv6 и требующие обращения к машинам IPv4, могут использовать отображенные IPv4-адреса. Они дополняют IPv4-адрес 80-ю нулевыми старшими разрядами и 16-битным значением

0xffff
, которое записывается как
::ffff:
, а за ним следует десятичный IPv4-адрес с точками. Подобная адресация позволяет большинству программ в системе, поддерживающей только версию IPv6, явно общаться с узлами IPv4.

IPv6-адреса хранятся в переменных типа

struct sockaddr_in6
.

#include <sys/socket.h>

#include <netinet/in.h>

struct sockaddr_in6 {

 short int sin6_family; /* AF_INET6 */

 unsigned short int sin6_port; /* номер порта */

 unsigned int sin6_flowinfo; /* информация о потоке обмена IPv6 */

 struct in6_addr sin6_addr; /* IP-адрес */

 unsigned int sin6_scope_id; /* набор граничных интерфейсов */

}

Данная структура подобна

struct sockaddr_in
; здесь первый член сохраняет семейство адресов (в этом примере
AF_INET6
), а следующий — 16-битный номер порта в сетевом порядке байтов.

Четвертый член содержит двоичное представление IPv6-адреса, выполняя те же самые функции, что и последний член структуры

struct sockaddr_in
. Оставшиеся два элемента
sin6_flowinfo
и
sin6_scope_id
используются в более сложных задачах и для большинства приложений должны быть равны нулю.

Стандарты ограничивают

struct sockaddr_in
в точности тремя членами, тогда как
struct sockaddr_in6
позволительно иметь дополнительные элементы. По этой причине программы, которые вручную заполняют
struct sockaddr_in6
, должны обнулить все данные структуры с помощью функции
memset
.

17.5.4. Манипулирование IP-адресами

В приложениях нередко требуется преобразовывать IP-адреса из удобочитаемых для человека представлений (либо десятичное с разделителями-точками,

либо с разделителями-двоеточиями) в двоичное представление
struct in_addr
и наоборот. Функция
inet_ntop
принимает двоичный IP-адрес и возвращает указатель на строку, содержащую десятичную форму с точками или двоеточиями.

#include <arpa/inet.h>

const char * inet_ntop(int family, const void * address, char * dest,

 int size);

Здесь

family
— это адресное семейство того адреса, который передается во втором параметре; поддерживаются только
AF_INET
и
AF_INET6
. Следующий параметр указывает на
struct in_addr
или
struct in6_addr6
в зависимости от первого параметра. Значение
dest
представляет массив символов, состоящий из
size
элементов, в котором хранится адрес, удобочитаемый для человека. Если форматирование адреса прошло успешно, то функция
inet_ntop
возвращает
dest
, в противном случае возвращается
NULL
. Существуют только две причины, по которым
inet_ntop
может не выполнить свою работу: если буфер назначения недостаточно велик для хранения форматированного адреса (переменной errno присваивается значение
ENOSPC
) или если параметр
family
задан неверно (errno содержит
EAFNOSUPPORT
).

INET_ADDRSTRLEN
является константой, определяющей наибольший размер
dest
, необходимый для хранения любого IPv4-адреса. Соответственно,
INET6_ADDRSTRLEN
определяет максимальный размер массива для IPv6-адреса.

Программа-пример

netlookup.с
демонстрирует использование
inet_ntop
; полная программа представлена далее в этой главе.

120: if (addr->ai_family == PF_INET) {

121: struct sockaddr_in * inetaddr = (void*)addr->ai_addr;

122: char nameBuf[INET_ADDRSTRLEN];

123:

124: if (serviceName)

125: printf("\tport %d", ntohs(inetaddr->sin_port));

126:

127: if (hostName)

128: printf("\thost %s",

129: inet_ntop(AF_INET, &inetaddr->sin_addr,

130: nameBuf, sizeof(nameBuf)));

131: } else if (addr->ai_family == PF_INET6) {

132: struct sockaddr_in6 *inetaddr =

133: (void *) addr->ai_addr;

134: char nameBuf[INET6_ADDRSTRLEN];

135:

136: if (serviceName)

137: printf("\tport %d", ntohs(inetaddr->sin6_port));

138:

139: if (hostName)

140: printf("\thost %s",

141: inet_ntop(AF_INET6, &inetaddr->sin6_addr,

Поделиться:
Популярные книги

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Кровь на эполетах

Дроздов Анатолий Федорович
3. Штуцер и тесак
Фантастика:
альтернативная история
7.60
рейтинг книги
Кровь на эполетах

Сыночек в награду. Подари мне любовь

Лесневская Вероника
1. Суровые отцы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сыночек в награду. Подари мне любовь

Кодекс Крови. Книга ХII

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан

Идеальный мир для Лекаря 4

Сапфир Олег
4. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 4

Релокант. По следам Ушедшего

Ascold Flow
3. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант. По следам Ушедшего

Мир-о-творец

Ланцов Михаил Алексеевич
8. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Мир-о-творец

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII

Попаданка в семье драконов

Свадьбина Любовь
Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.37
рейтинг книги
Попаданка в семье драконов

Новые горизонты

Лисина Александра
5. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Новые горизонты

Скрываясь в тени

Мазуров Дмитрий
2. Теневой путь
Фантастика:
боевая фантастика
7.84
рейтинг книги
Скрываясь в тени