UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Выделенный сокет может быть передан потоку или дочернему процессу для обработки запросов клиента. Листинг 23.15 демонстрирует новую модифицированную версию сервера, который обрабатывает первое сообщение клиента, выделяет ассоциацию при помощи
sctp_peeloff
str_echo
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 connfd = sctp_peeloff(sock_fd, assoc);
37 if (connfd == -1) {
38 err_ret("sctp_peeloff fails");
39 continue;
40 }
41 if ((childpid = fork()) == 0) {
42 Close(sock_fd);
43 str_echo(connfd);
44 exit(0);
45 } else {
46 Close(connfd);
47 }
48 }
26-30
31-35
36-40
sctp_peeloff
str_echo
41-47
23.11. Управление таймерами
Протокол SCTP имеет множество численных пользовательских параметров. Все они устанавливаются через параметры сокетов, рассмотренные в разделе 7.10. Далее мы займемся рассмотрением нескольких параметров, определяющих задержку перед объявлением об отказе ассоциации или адреса собеседника.
Время обнаружения отказа в SCTP определяется семью переменными (табл. 23.1).
Таблица 23.1. Поля таймеров SCTP
Поле | Описание | По умолчанию | Единицы |
---|---|---|---|
srto_min | Минимальный тайм-аут повторной передачи | 1000 | Мс |
srto_max | Максимальный тайм-аут повторной передачи | 60000 | Мс |
srto_initial | Начальный тайм-аут повторной передачи | 3000 | Мс |
sinit_max_init_timeo | Максимальный тайм-аут повторной передачи сегмента INIT | 3000 | Мс |
sinit_max_attempts | Максимальное количество повторных передач сегмента INIT | 8 | попыток |
spp_pathmaxrxt | Максимальное количество повторных передач по адресу | 5 | попыток |
sasoc_asocmaxrxt | Максимальное количество повторных передач на ассоциацию | 10 | попыток |
Эти параметры можно воспринимать как регуляторы, укорачивающие и удлиняющие время обнаружения отказа. Рассмотрим два сценария.
1. Конечная точка SCTP пытается открыть ассоциацию с собеседником, отключившимся от сети.
2. Две многоинтерфейсные конечные точки SCTP обмениваются данными. Одна из них отключается от сети питания в момент передачи данных. Сообщения ICMP фильтруются защитными экранами и потому не достигают второй конечной точки.
В сценарии 1 система, пытающаяся открыть соединение, устанавливает таймер RTO равным
srto_initial
sinit_max_attempts
sinit_max_init_timeo
Вращением нескольких «ручек» мы можем удлинять и укорачивать это время. Начнем с двух параметров, позволяющих уменьшить общую задержку. Сократим количество повторных передач, изменив переменную
sinit_max_attempts
srto_max_init_timeo