UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
23 ".msg %d", i);24 Sctp_sendmsg(sock_fd, sendline, sizeof(sendline),25 to, tolen, 0, 0, i, 0, 0);26 }27 for (i =0; i < SERV_MAX_SCTP_STRM; i++) {28 len = sizeof(peeraddr);29 rd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),30 (SA*)&peeraddr, &len, &sri, &msg_flags);31 printf("From str:%d seq:%d (assoc:0x%x)",32 sri.sinfo_stream, sri.sinfo_ssn,33 (u_int)sri, sinfo_assoc_id);34 printf("%.*sn", rd_sz, recvline);35 }36 }37 }13-15srifgets16-2021-26sctp_sendmsgSCTP_MAXLINE.msgЭтот код может работать неправильно, если окна приема и отправки будут слишком малы. Если окно приема собеседника слишком мало, клиент может заблокироваться. Поскольку клиент не переходит к считыванию данных из приемного буфера, пока он не отправит все сообщения, сервер также может заблокироваться в ожидании освобождения буфера клиента. В результате обе конечные точки SCTP зависнут. Приведенная программа не рассчитана на масштабирование. Она предназначена лишь для иллюстрации потоков и блокирования очередей в простейшем варианте.
27-35Запуск программы
Мы запустили клиент и сервер на разных компьютерах с FreeBSD, между которыми был установлен настраиваемый маршрутизатор (рис. 10.4). Маршрутизатор может создавать задержку и сбрасывать часть пакетов. Сначала мы запускаем программу без сброса пакетов на маршрутизаторе.

Рис. 10.4. Тестовая конфигурация сети
Мы запускаем сервер с аргументом 0 в командной строке, благодаря чему сервер не увеличивает номер потока при отправке эхо-ответа.
Затем мы запускаем клиент, передавая ему в командной строке адрес эхо-сервера и дополнительный аргумент, указывающий на необходимость отправки сообщений по всем потокам одновременно.
freebsd4% <b>sctpclient01 10.1.4.1 echo</b>Echoing messages to all streams<b>Hello</b>From str:0 seq:0 (assoc:0xc99e15a0):Hello.msg.0From str:1 seq:0 (assoc.0xc99e15a0):Hello.msg.1From str:2 seq:0 (assoc:0xc99e15a0):Hello.msg.2From str:3 seq:0 (assoc 0xc99e15a0):Hello.msg.3From str:4 seq:0 (assoc.0xc99e15a0):Hello.msg.4From str:5 seq:0 (assoc:0xc99e15a0):Hello.msg.5From str:6 seq:0 (assoc.0xc99e15a0):Hello.msg.6From str:7 seq:0 (assoc:0xc99e15a0):Hello.msg.7From str:8 seq:0 (assoc:0xc99e15a0):Hello.msg.8From str:9 seq:0 (assoc:0xc99e15a0).Hello.msg.9<b>^D</b>freebsd4%В отсутствие потерь при передаче клиент получает ответы сервера в том же порядке, в котором отправляет запросы. Изменим параметры маршрутизатора таким образом, чтобы терять 10% всех пакетов, передаваемых в обоих направлениях, и перезапустим клиент.
freebsd4% <b>sctpclient01 10.1.4.1 echo</b>Echoing messages to all streams<b>Hello</b>From str:0 seq:0 (assoc:0xc99e15a0):Hello.msg.0From str:2 seq:0 (assoc:0xc99e15a0):Hello.msg.2From str:3 seq:0 (assoc:0xc99e15a0):Hello.msg.3From str:5 seq:0 (assoc:0xc99e15a0):Hello.msg.5From str:1 seq:0 (assoc:0xc99e15a0):Hello.msg.1From str:8 seq:0 (assoc:0xc99e15a0):Hello.msg.8From str:4 seq:0 (assoc:0xc99e15a0):Hello.msg.4From str:7 seq:0 (assoc:0xc99e15a0):Hello.msg.7From str:9 seq:0 (assoc:0xc99e15a0):Hello.msg.9From str:6 seq:0 (assoc:0xc99e15a0):Hello msg.6<b>^D</b>freebsd4%Можно проверить, действительно ли сообщения в каждом из потоков доставляются в правильном порядке, если изменить клиента так, чтобы он отправлял по два сообщения в поток. Кроме того, мы добавим к сообщению суффикс с его номером, чтобы отличать эхо-ответы друг от друга. Измененная функция клиента представлена в листинге 10.5.
Листинг 10.5. Изменения в функции sctp_strcliecho
//sctp/sctp_strcliecho2.c21 for (i =0; i < SERV_MAX_SCTP_STRM; i++) {
