UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
2-7proto815-24-vpingSIGALRM31-48host_servaddrinfoAF_INETAF_INET6protoIN6_IS_ADDR_V4MAPPEDgetaddrinfoОбработка ответов осуществляется функцией
readlоорЛистинг 28.4. Функция readloop
//ping/readlоор.c 1 #include "ping.h" 2 void 3 readloop(void) 4 { 5 int size; 6 char recvbuf[BUFSIZE]; 7 char controlbuf[BUFSIZE]; 8 struct msghdr msg; 9 struct iovec iov;10 ssize_t n;11 struct timeval tval;12 sockfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);13 setuid(getuid()); /* права привилегированного пользователя больше не нужны */14 if (pr->finit)15 (*pr->finit)();16 size = 60 * 1024; /* setsockopt может завершиться с ошибкой */17 setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));18 sig_alrm(SIGALRM); /* отправка первого пакета */19 iov.iov_base = recvbuf;20 iov.iov_len = sizeof(recvbuf);21 msg.msg_name = pr->sarecv;22 msg.msg_iov = &iov;23 msg.msg_iovlen = 1;24 msg.msg_control = controlbuf;25 for (;;) {26 msg.msg_namelen = pr->salen;27 msg.msg_controllen = sizeof(controlbuf);28 n = recvmsg(sockfd, &msg, 0);29 if (n < 0) {30 if (errno == EINTR)31 continue;32 else33 err_sys("recvmsg error");24 }35 Gettimeofday(&tval, NULL);36 (*pr->fproc)(recvbuf, n, &msg, &tval);37 }38 }12-13setuid14-1516-17ping18SIGALRM
