23.2. Сервер типа «один-ко-многим» с автоматическим закрытием
23.2. Сервер типа «один-ко-многим» с автоматическим закрытием
Вспомните программу-сервер, которую мы написали в главе 10. Эта программа не отслеживала ассоциации. Сервер рассчитывал, что клиент самостоятельно закроет ассоциацию, удалив тем самым данные о ее состоянии. Однако такой подход делает сервер уязвимым: что если клиент откроет ассоциацию, но никаких данных не пришлет? Для такого клиента будут выделены ресурсы, которые он не использует. Неудачное стечение обстоятельств может привести к DoS-атаке на нашу реализацию SCTP со стороны неактивных клиентов. Для предотвращения подобных ситуаций в SCTP была добавлена функция автоматического закрытия ассоциаций (autoclose).
Автоматическое закрытие позволяет конечной точке SCTP задавать максимальную длительность бездействия ассоциации. Ассоциация считается бездействующей, если по ней не передаются никакие данные (ни в одном направлении). Если длительность бездействия превышает установленное ограничение, ассоциация автоматически закрывается реализацией SCTP.
Особое внимание следует уделить выбору ограничения на время бездействия. Значение не должно быть слишком маленьким, иначе сервер может в какой-то момент обнаружить, что ему требуется передать данные по уже закрытой ассоциации. На повторное открытие ассоциации будут затрачены ресурсы, да и вообще маловероятно, что клиент будет готов принять входящую ассоциацию. В листинге 23.1[1] приведена новая версия кода нашего сервера, в которую добавлены вызовы, защищающие этот сервер от неактивных клиентов. Как отмечалось в разделе 7.10, функция автоматического закрытия по умолчанию отключена и должна быть включена явным образом при помощи параметра сокета SCTP_AUTOCLOSE.
Листинг 23.1. Включение автоматического закрытия сокета на сервере
//sctp/sctpserv04.c
14 if (argc == 2)
15 stream_increment = atoi(argv[1]);
16 sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
17 close_time = 120;
18 Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_AUTOCLOSE,
19 &close_time, sizeof(close_time));
20 bzero(&servaddr, sizeof(servaddr));
21 servaddr.sin_family = AF_INET;
22 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
23 servaddr.sin_report = htons(SERV_PORT);
Установка автоматического закрытия
17-19 Сервер устанавливает ограничение на простой ассоциаций равным 120 с и помещает это значение в переменную close_time. Затем сервер вызывает функцию setsockopt с параметром SCTP_AUTOCLOSE, устанавливающим выбранное ограничение. В остальном код сервера остается прежним.
Теперь SCTP будет автоматически закрывать ассоциации, простаивающие более двух минут. Автоматическое закрытие ассоциаций уменьшает расходы ресурсов сервера на неактивных клиентов.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Сокет типа «один-к-одному»
Сокет типа «один-к-одному» Данный тип сокета был разработан специально для облегчения переноса существующих приложений с TCP на SCTP. Его модель практически идентична описанной в главе 4. Существуют, конечно, некоторые отличия, о которых следует помнить (в особенности, при
Сокет типа «один-ко-многим»
Сокет типа «один-ко-многим» Сокет типа «один-ко-многим» дает разработчику приложения возможность написать сервер, не использующий большого количества дескрипторов сокетов. Один дескриптор для такого сервера будет представлять несколько ассоциаций, подобно сокету UDP,
10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main
10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main Наши клиент и сервер SCTP вызывают функции в последовательности, представленной на рис. 9.2. Код последовательного сервера представлен в листинге 10.1[1].Листинг 10.1. Потоковый эхо-сервер SCTP//sctp/sctpserv01.c 1 #include "unp.h" 2 int 3
30.5. Параллельный сервер TCP: один дочерний процесс для каждого клиента
30.5. Параллельный сервер TCP: один дочерний процесс для каждого клиента Традиционно параллельный сервер TCP вызывает функцию fork для порождения нового дочернего процесса, который будет выполнять обработку очередного клиентского запроса. Это позволяет серверу обрабатывать
30.10. Параллельный сервер TCP: один поток для каждого клиента
30.10. Параллельный сервер TCP: один поток для каждого клиента Предыдущие пять разделов были посвящены рассмотрению серверов, в которых для обработки клиентских запросов используются дочерние процессы, либо заранее порождаемые с помощью функции fork, либо требующие вызова
18.10.4. Dante — еще один сервер SOCKS5
18.10.4. Dante — еще один сервер SOCKS5 Этот сервер считается более простым в настройке. Он использует файл конфигурации /etc/sockd.conf (листинг 18.2).Листинг 18.2. Примерный файл /etc/sockd.confinternal: 192.168.0.1 port = 1080external: 111.111.111.111client pass { from: 192.168.0.0/16 to: 0.0.0.0/0}pass { from: 0.0.0.0/0 to: 192.168.0.0/16 command: bindreply udpreply log:
7. Предложение коучинга в мини-группе или один на один
7. Предложение коучинга в мини-группе или один на один Если человек оплатил товар и даже купил у вас что-то еще, это не повод останавливаться. Вы можете позвонить всем клиентам по телефону и предложить бесплатную 15-минутную личную консультацию и продать коучинг один на
4.2. Приложение типа клиент-сервер
4.2. Приложение типа клиент-сервер Пример приложения модели клиент-сервер приведен на рис. 4.1. Именно на него мы будем ссылаться в тексте этой главы и главы 6 при необходимости проиллюстрировать использование программных каналов, FIFO и очередей сообщений System V.Клиент
Отношения типа один-к-одному
Отношения типа один-к-одному Предположим, в вашей базе данных есть таблицы, в которых хранится информация о сотрудниках и видах работ. Если каждому служащему назначается один вид работы, то отношение между сотрудниками и видами работ можно определить типом один-к-одному,
Отношения типа один-ко-многим
Отношения типа один-ко-многим Гораздо чаще, чем отношения типа один-к-одному, в базах данных используются отношения типа один-ко-многим, в которых каждая запись таблицы связана с одной или несколькими записями в другой таблице (или вообще не связана ни с какими записями). В
Отношения типа многие-ко-многим
Отношения типа многие-ко-многим Отношение типа многие-ко-многим по сравнению с отношением один-ко-многим идет еще дальше. В качестве классического примера отношения типа многие-ко-многим можно привести отношение между студентами и классами. Каждый студент может иметь
Отношение многие-ко-многим
Отношение многие-ко-многим В этом интересном случае, показанном на рис. 17.2, наша модель данных показывает, что каждая строка в таблице TableA может иметь отношения со множеством строк таблицы TableB, и в то же время каждая строка в TableB может иметь множественные отношения со
PS4 стартовала, Xbox One на подходе: один на один или двое против всех? Евгений Золотов
PS4 стартовала, Xbox One на подходе: один на один или двое против всех? Евгений Золотов Опубликовано 18 ноября 2013 Затянувшееся перемирие в войне игровых консолей окончено: в пятницу в США стартовали продажи Sony PlayStation 4, а её основной соперник, Xbox One от