UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
15. Будем считать, что и клиент, и сервер устанавливают параметр сокета
SO_KEEPALIVE16. Почти все реализации определяют константу
SO_ACCEPTCONN<sys/socket.h>Глава 8
Основные сведения о сокетах UDP
8.1. Введение
Приложения, использующие TCP и UDP, фундаментально отличаются друг от друга, потому что UDP является ненадежным протоколом дейтаграмм, не ориентированным на установление соединения, и этим принципиально непохож на ориентированный на установление соединения и надежную передачу потока байтов TCP. Тем не менее есть случаи, когда имеет смысл использовать UDP вместо TCP. Подобные случаи мы рассматриваем в разделе 22.4. Некоторые популярные приложения построены с использованием UDP, например DNS (Domain Name System — система доменных имен), NFS (сетевая файловая система — Network File System) и SNMP (Simple Network Management Protocol — простой протокол управления сетью).
На рис. 8.1 показаны вызовы функций для типичной схемы клиент-сервер UDP. Клиент не устанавливает соединения с сервером. Вместо этого клиент лишь отправляет серверу дейтаграмму, используя функцию
sendtorecvfromrecvfrom
Рис. 8.1. Функции сокета для модели клиент-сервер UDP
Рисунок 8.1 иллюстрирует временную диаграмму типичного сценария обмена UDP-дейтаграммами между клиентом и сервером. Мы можем сравнить этот пример с типичным обменом по протоколу TCP, изображенным на рис. 4.1.
В этой главе мы опишем новые функции, применяемые с сокетами UDP, —
recvfromsendto8.2. Функции recvfrom и sendto
Эти две функции аналогичны стандартным функциям
readwrite#include <sys/socket.h>ssize_t recvfrom(int <i>sockfd</i>, void *<i>buff</i>, size_t <i>nbytes</i>, int <i>flags</i>, struct sockaddr *<i>from</i>, socklen_t *<i>addrlen</i>);ssize_t sendto(int <i>sockfd</i>, const void *<i>buff</i>, size_t <i>nbytes</i>, int <i>flags</i>, const struct sockaddr *<i>to</i>, socklen_t <i>addrlen</i>);<i>Обе функции возвращают количество записанных или прочитанных байтов в случае успешного выполнения, -1 в случае ошибки</i>Первые три аргумента,
sockfdbuffnbytesreadwriteМы расскажем об аргументе
flagsrecvsendrecvmsgsendmsgflagsАргумент to для функции
sendtoaddrlenrecvformaddrlensendtorecvfromПоследние два аргумента функции recvfrom аналогичны двум последним аргументам функции
acceptsendtoconnectОбе функции возвращают в качестве значения функции длину данных, которые были прочитаны или записаны. При типичном использовании функции
recvfromДейтаграмма может иметь нулевую длину. В случае UDP при этом возвращается дейтаграмма IP, содержащая заголовок IP (обычно 20 байт для IPv4 или 40 байт для IPv6), 8-байтовый заголовок UDP и никаких данных. Это также означает, что возвращаемое из функции
recvfromreadЕсли аргумент from функции
recvfromaddrlen
