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-19SO_LINGERl_onoffl_lingercloseПотом мы изменяем наш сервер TCP, приведенный в листингах 6.3 и 6.4, с тем чтобы после сообщения функции
selectaccept+ if (FD_ISSET(listenfd, &rset)) { /* новое соединение */+ printf("listening socket readablen");+ sleep(5); clilen = sizeof(cliaddr); connfd = Accept(listenfd, (SA*)&cliaddr, &clilen);Здесь мы имитируем занятый сервер, который не может вызвать функцию
acceptselectВ разделе 5.11 мы отмечали, что когда клиент разрывает соединение до того, как сервер вызывает функцию
acceptECONNABORTEDEPROTO■ Клиент устанавливает соединение и затем прерывает его, как показано в листинге 16.14.
■ Функция
selectaccept■ После того, как сервер получил сообщение от функции
selectaccept■ Установленное соединение удаляется из очереди, и мы предполагаем, что не существует никаких других установленных соединений.
■ Сервер вызывает функцию
acceptСервер останется блокированным в вызове функции
acceptacceptПроблема в некоторой степени аналогична проблеме, называемой атакой типа «отказ в обслуживании», описанной в разделе 6.8. Однако в данном случае сервер выходит из состояния блокировки, как только другой клиент установит соединение.
Чтобы решить эту проблему, нужно соблюдать два следующих правила:
1. Всегда делать прослушиваемый сокет неблокируемым, если мы используем функцию
select2. Игнорировать следующие ошибки, возникающие при повторном вызове функции
acceptEWOULDBLOCKECONNABORTEDEPROTOEINTR16.7. Резюме
В примере неблокируемого чтения и записи в разделе 16.2 использовался наш клиент
str_cliselectforkНеблокируемая функция
connectconnectУпражнения
1. Обсуждая листинг 16.6, мы отметили, что родительский процесс должен вызвать функцию
shutdownclose
