UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
9 err_quit("usage: tcpcli <IPaddress>");
10 sockfd = Socket(AF_INET, SOCK_STREAM, 0);
11 bzero(&servaddr, sizeof(servaddr));
12 servaddr.sin_family = AF_INET;
13 servaddr.sin_port = htons(SERV_PORT);
14 Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
15 Connect(sockfd, (SA*)&servaddr, sizeof(servaddr));
16 ling.l_onoff = 1; /* для отправки сегмента RST при закрытии соединения */
17 ling.l_linger = 0;
18 Setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));
19 Close(sockfd);
20 exit(0);
21 }
16-19
SO_LINGER
l_onoff
l_linger
close
Потом мы изменяем наш сервер TCP, приведенный в листингах 6.3 и 6.4, с тем чтобы после сообщения функции
select
accept
+
if (FD_ISSET(listenfd, &rset)) { /* новое соединение */
+ printf("listening socket readablen");
+ sleep(5);
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA*)&cliaddr, &clilen);
Здесь мы имитируем занятый сервер, который не может вызвать функцию
accept
select
В разделе 5.11 мы отмечали, что когда клиент разрывает соединение до того, как сервер вызывает функцию
accept
ECONNABORTED
EPROTO
■ Клиент устанавливает соединение и затем прерывает его, как показано в листинге 16.14.
■ Функция
select
accept
■ После того, как сервер получил сообщение от функции
select
accept
■ Установленное соединение удаляется из очереди, и мы предполагаем, что не существует никаких других установленных соединений.
■ Сервер вызывает функцию
accept
Сервер останется блокированным в вызове функции
accept
accept
Проблема в некоторой степени аналогична проблеме, называемой атакой типа «отказ в обслуживании», описанной в разделе 6.8. Однако в данном случае сервер выходит из состояния блокировки, как только другой клиент установит соединение.
Чтобы решить эту проблему, нужно соблюдать два следующих правила:
1. Всегда делать прослушиваемый сокет неблокируемым, если мы используем функцию
select
2. Игнорировать следующие ошибки, возникающие при повторном вызове функции
accept
EWOULDBLOCK
ECONNABORTED
EPROTO
EINTR
16.7. Резюме
В примере неблокируемого чтения и записи в разделе 16.2 использовался наш клиент
str_cli
select
fork
Неблокируемая функция
connect
connect
Упражнения
1. Обсуждая листинг 16.6, мы отметили, что родительский процесс должен вызвать функцию
shutdown
close