UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
8.5. Эхо-клиент UDP: функция main
Функция
mainЛистинг 8.3. Эхо-клиент UDP
//udpcliserv/udpcli01.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int sockfd; 6 struct sockaddr_in servaddr; 7 if (argc != 2) 8 err_quit("usage: udpcli <Ipaddress>"); 9 bzero(&servaddr, sizeof(servaddr));10 servaddr.sin_family = AF_INET;11 servaddr.sin_port = htons(SERV_PORT);12 Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);13 sockfd = Socket(AF_INET, SOCK_DGRAM, 0);14 dg_cli(stdin, sockfd, (SA*)&servaddr, sizeof(servaddr));15 exit(0);16 }9-12dg_cli13-14dg_cli8.6. Эхо-клиент UDP: функция dg_cli
В листинге 8.4 показана функция
dg_cliЛистинг 8.4. Функция dg_cli: цикл обработки клиента
//lib/dg_cli.c 1 #include "unp.h" 2 void 3 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) 4 { 5 int n; 6 char sendline[MAXLINE], recvline[MAXLINE + 1]; 7 while (Fgets(sendline, MAXLINE, fp) != NULL) { 8 Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); 9 n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);10 recvline[n] = 0; /* завершающий нуль */11 Fputs(recvline, stdout);12 }13 }7-12fgetssendtorecvfromfputsНаш клиент не запрашивал у ядра присваивания динамически назначаемого порта своему сокету (тогда как для клиента TCP это имело место при вызове функции
connectsendtoОбратите внимание, что при вызове функции
recvfromКак и в случае функции сервера
dg_echodg_clidg_cli8.7. Потерянные дейтаграммы
Клиент и сервер UDP в нашем примере являются ненадежными. Если дейтаграмма клиента потеряна (допустим, она проигнорирована неким маршрутизатором между клиентом и сервером), клиент навсегда заблокируется в своем вызове функции
recvfromdg_clirecvfromrecvfromПростое помещение тайм-аута в вызов функции
recvfrom8.8. Проверка полученного ответа
В конце раздела 8.6 мы упомянули, что любой процесс, который знает номер динамически назначаемого порта клиента, может отправлять дейтаграммы нашему клиенту, и они будут перемешаны с нормальными ответами сервера. Все, что мы можем сделать, — это изменить вызов функции
recvfrom
