Страница 266 из 399
Выделенный сокет может быть передан потоку или дочернему процессу для обработки запросов клиента. Листинг 23.15 демонстрирует новую модифицированную версию сервера, который обрабатывает первое сообщение клиента, выделяет ассоциацию при помощи sctp_peeloff, порождает дочерний процесс и вызывает функцию str_echo для TCP, которая была написана в разделе 5.3. Адрес из полученного сообщения мы передаем нашей функции из раздела 23.8, которая по этому адресу определяет идентификатор ассоциации. Идентификатор хранится также в поле sri, sinfo_assoc_id. Наша функция служит лишь иллюстрацией использования альтернативного метода. Породив процесс, сервер переходит к обработке следующего сообщения.
Листинг 23.15. Параллельный сервер SCTP
//sctp/sctpserv_fork.c
23 for (;;) {
24 len = sizeof(struct sockaddr_in);
25 rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),
26 (SA*)&cliaddr, &len, &sri, &msg_flags);
27 Sctp_sendmsg(sock_fd, readbuf, rd_sz,
28 (SA*)&cliaddr, len,
29 sri.sinfo_ppid,
30 sri.sinfo_flags, sn.sinfo_stream, 0, 0);
31 assoc = sctp_address_to_associd(sock_fd, (SA*)&cliaddr, len);
32 if ((int)assoc == 0) {
33 err_ret("Can't get association id");
34 continue;
35 }
36 co
37 if (co
38 err_ret("sctp_peeloff fails");
39 continue;
40 }
41 if ((childpid = fork()) == 0) {
42 Close(sock_fd);
43 str_echo(co
44 exit(0);
45 } else {
46 Close(co
47 }
48 }
26-30 Сервер получает и обрабатывает первое сообщение клиента.
31-35 Сервер вызывает функцию из листинга 23.13 для получения идентификатора ассоциации по ее адресу. Если что-то мешает серверу получить идентификатор, он не делает попыток породить дочерний процесс, а просто переходит к обработке следующего сообщения.
36-40 Сервер выделяет ассоциацию в отдельный дескриптор сокета при помощи sctp_peeloff. Полученный сокет типа «один-к-одному» может быть без проблем передан написанной ранее для TCP функции str_echo.
41-47 Сервер порождает дочерний процесс, который и выполняет всю обработку по конкретному дескриптору.
23.11. Управление таймерами
Протокол SCTP имеет множество численных пользовательских параметров. Все они устанавливаются через параметры сокетов, рассмотренные в разделе 7.10. Далее мы займемся рассмотрением нескольких параметров, определяющих задержку перед объявлением об отказе ассоциации или адреса собеседника.
Время обнаружения отказа в SCTP определяется семью переменными (табл. 23.1).
Таблица 23.1. Поля таймеров SCTP