Книга: 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 для указания на отсутствие ассоциации.

Оглавление книги


Генерация: 1.282. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз