UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
И функция
recvfromsendto8.3. Эхо-сервер UDP: функция main
Теперь мы переделаем нашу простую модель клиент-сервер из главы 5, используя UDP. Диаграмма вызовов функций в программах наших клиента и сервера UDP показана на рис. 8.1. На рис. 8.2 представлены используемые функции. В листинге 8.1 [1] показана функция сервера
mainРис. 8.2. Простая модель клиент-сервер, использующая UDP
Листинг 8.1. Эхо-сервер UDP
//udpcliserv/udpserv01.с 1 #include "unp.h" 2 3 intmain(int argc, char **argv) 4 { 5 int sockfd; 6 struct sockaddr_in servaddr, cliaddr; 7 sockfd = Socket(AF_INET, SOCK_DGRAM, 0); 8 bzero(&servaddr, sizeof(servaddr)); 9 servaddr.sin_family = AF_INET;10 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);11 servaddr.sin_port = htons(SERV_PORT);12 Bind(sockfd, (SA*)&servaddr, sizeof(servaddr));13 dg_echo(sodkfd, (SA*)&cliaddr, sizeof(cliaddr));14 }7-12socketSOCK_DGRAMINADDR_ANYSERV_PORTunp.h13dg_echo8.4. Эхо-сервер UDP: функция dg_echo
В листинге 8.2 показана функция
dg_echoЛистинг 8.2. Функция dg_echo: отражение строк на сокете дейтаграмм
//lib/dg_echo.c 1 #include "unp.h" 2 void 3 dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen) 4 { 5 int n; 6 socklen_t len; 7 char mesg[MAXLINE]; 8 for (;;) { 9 len = clilen;10 n = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);11 Sendto(sockfd, mesg, n, 0, pcliaddr, len);12 }13 }8-12recvfromsendtoНесмотря на простоту этой функции, нужно учесть ряд важных деталей. Во- первых, эта функция никогда не завершается. Поскольку UDP — это протокол, не ориентированный на установление соединения, в нем не существует никаких аналогов признака конца файла, используемого в TCP.
Во-вторых, эта функция позволяет создать последовательный сервер, а не параллельный, который мы получали в случае TCP. Поскольку нет вызова функции
forkДля сокета на уровне UDP происходит неявная буферизация дейтаграмм в виде очереди. Действительно, у каждого сокета UDP имеется буфер приема, и каждая дейтаграмма, приходящая на этот сокет, помещается в его буфер приема. Когда процесс вызывает функцию
recvfromSO_RCVBUFНа рис. 8.3 показано обобщение нашей модели TCP клиент-сервер из главы 5, когда два клиента устанавливают соединения с сервером.

Рис. 8.3. Обобщение модели TCP клиент-сервер с двумя клиентами
Здесь имеется два присоединенных сокета, и каждый из присоединенных сокетов на узле сервера имеет свой собственный буфер приема. На рис. 8.4 показан случай, когда два клиента отправляют дейтаграммы серверу UDP.

Рис. 8.4. Обобщение модели UDP клиент-сервер с двумя клиентами
Существует только один процесс сервера, и у него имеется один сокет, на который сервер получает все приходящие дейтаграммы и с которого отправляет все ответы. У этого сокета имеется буфер приема, в который помещаются все приходящие дейтаграммы.
Функция
mainAF_INETdg_echodg_echomaindg_echodg_echorecvfromsendtorecvfrompcliaddrsendto
