UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
11 struct sockaddr_un cliaddr;
12 /* прототипы функций */
13 int readable_conn(int);
14 int readable_listen(void);
15 int readable_v4(void);
16 int readable_v6(void);
2-17
client
AF_INET
AF_INET6
В листинге 28.24 приведена первая часть функции main.
Листинг 28.24. Первая часть функции main: создание сокетов
//icmpd/icmpd.c
1 #include "icmpd.h"
2 int
3 main(int argc, char **argv)
4 {
5 int i, sockfd;
6 struct sockaddr_un sun;
7 if (argc != 1)
8 err_quit("usage: icmpd");
9 maxi = -1; /* индекс массива client[] */
10 for (i = 0; i < FD_SETSIZE; i++)
11 client[i].connfd = -1; /* -1 означает свободный элемент */
12 FD_ZERO(&allset);
13 fd4 = Socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
14 FD_SET(fd4, &allset);
15 maxfd = fd4;
16 #ifdef IPV6
17 fd6 = Socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
18 FD_SET(fd6, &allset);
19 maxfd = max(maxfd, fd6);
20 #endif
21 listenfd = Socket(AF_UNIX, SOCK_STREAM, 0);
22 sun.sun_family = AF_LOCAL;
23 strcpy(sun.sun_path, ICMPD_PATH);
24 unlink(ICMPD_PATH);
25 Bind(listenfd, (SA*)&sun, sizeof(sun));
26 Listen(listenfd, LISTENQ);
27 FD_SET(listenfd, &allset);
28 maxfd = max(maxfd, listenfd);
9-10
client
12-28
bind
listen
connect
select
accept
В листинге 28.25 приведена вторая часть функции
main
select
Листинг 28.25. Вторая часть функции main: обработка готового к чтению дескриптора
//icmpd/icmpd.c
29 for (;;) {
30 rset = allset;
31 nready = Select(maxfd+1, &rset, NULL, NULL, NULL);
32 if (FD_ISSET(listenfd, &rset))
33 if (readable_listen() <= 0)
34 continue;
35 if (FD_ISSET(fd4, &rset))
36 if (readable_v4() <= 0)
37 continue;
38 #ifdef IPV6
39 if (FD_ISSET(fd6, &rset))
40 if (readable_v6() <= 0)
41 continue;
42 #endif
43 for (i = 0; i <= maxi; i++) { /* проверка всех клиентов */
44 if ( (sockfd = client[i].connfd) < 0)
45 continue;
46 if (FD_ISSET(sockfd, &rset))
47 if (readable_conn(i) <= 0)
48 break; /* готовых дескрипторов больше нет */
49 }
50 }
51 exit(0);
52 }
32-34
readable_listen
nready
readablе_XXX
select