Книга: UNIX: разработка сетевых приложений
23.8. Определение идентификатора ассоциации по IP-адресу
Разделы на этой странице:
23.8. Определение идентификатора ассоциации по IP-адресу
Модифицированный клиент из раздела 23.7 использовал уведомления в качестве сигнала для получения списков адресов. Это было достаточно удобно, поскольку идентификатор ассоциации, для которой требовалось получить адреса, содержался в уведомлении в поле sac_assoc_id
. Но что если приложение не отслеживает идентификаторы ассоциаций, а ему вдруг понадобилось определить какой- либо идентификатор по адресу собеседника? В листинге 23.13 представлена простая функция, преобразующая адрес собеседника в идентификатор ассоциации. Эта функция будет использоваться сервером из раздела 23.10.
Листинг 23.13. Преобразование адреса в идентификатор ассоциации
//sctp/sctp_addr_to_associd.с
1 #include "unp.h"
2 sctp_assoc_t
3 sctp_address_to_associd(int sock_fd, struct sockaddr *sa, socklen_t salen)
4 {
5 struct sctp_paddrparams sp;
6 int siz;
7 siz = sizeof(struct sctp_paddrparams);
8 bzero(&sp, siz);
9 memcpy(&sp, spp_address, sa.salen);
10 sctp_opt_info(sock_fd, 0, SCTP_PEER_ADDR_PARAMS, &sp, &siz);
11 return(sp.spp_assoc_id);
12 }
Инициализация
7-8
Функция начинает работу с инициализации структуры sctp_paddrparams
.
Копирование адреса
9
Мы копируем адрес в структуру sctp_paddrparams
, используя переданную нам вызвавшим процессом информацию о длине этого адреса.
Вызов параметра сокета
10
При помощи параметра сокета SCTP_PEER_ADDR_PARAMS
наша функция запрашивает параметры адреса собеседника. Обратите внимание, что мы используем sctp_opt_info
вместо getsockopt
, потому что параметр SCTP_PEER_ADDR_PARAMS
требует копирования аргументов как в ядро, так и из ядра. Вызов, который мы делаем, возвратит нам текущий интервал проверки работоспособности соединения, максимальное количество попыток повторной передачи перед принятием решения о признании адреса собеседника отказавшим, и, что самое важное, идентификатор ассоциации. Мы не проверяем возвращаемое значение, потому что если вызов оказывается неудачным, мы хотим вернуть 0.
11
Функция возвращает идентификатор ассоциации. Если вызов sctp_opt_info
оказался неудачным, обнуление структуры гарантирует, что вызвавший нашу функцию процесс получит 0. Идентификатор ассоциации нулевым быть не может. Это значение используется реализацией SCTP для указания на отсутствие ассоциации.
- 23.1. Введение
- 23.2. Сервер типа «один-ко-многим» с автоматическим закрытием
- 23.3. Частичная доставка
- 23.4. Уведомления
- 23.5. Неупорядоченные данные
- 23.6. Связывание с подмножеством адресов
- 23.7. Получение адресов
- 23.8. Определение идентификатора ассоциации по IP-адресу
- 23.9. Проверка соединения и ошибки доступа
- 23.10. Выделение ассоциации
- 23.11. Управление таймерами
- 23.12. Когда SCTP оказывается предпочтительнее TCP
- 23.13. Резюме
- Упражнения
- Раздел идентификатора
- 1.2. Определение количества информации. Единицы измерения количества информации
- Определение версии клиента
- Определение пользовательского формата числовых данных
- Определение целей. Построение цепочек
- Определение необходимого системного вызова
- 7.9 Будущее управления хранилищами по версии ассоциации SNIA: стандарты SMI
- Раздел 1 Лояльность: определение и ключевые факторы
- Определение позиционного уровня
- 3.3. Определение объектов защиты
- Определение собственной миссии
- Определение факторов риска