UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
19-23
maxfd
select
nlefttoread
nlefttoconn
nconn
В листинге 16.10 показана функция
home_page
Листинг 16.10. Функция home_page
//nonblock/home_page.c
1 #include "web.h"
2 void
3 home_page(const char *host, const char *fname)
4 {
5 int fd, n;
6 char line[MAXLINE];
7 fd = Tcp_connect(host, SERV); /* блокируемая функция connect() */
8 n = snprintf(line, sizeof(line), GET_CMD, fname);
9 Writen(fd, line, n);
10 for (;;) {
11 if ((n = Read(fd, line, MAXLINE)) == 0)
12 break; /* сервер закрыл соединение */
13 printf("read %d bytes of home pagen", n);
14 /* обрабатываем полученные данные */
15 }
16 printf("end-of-file on home pagen");
17 Close(fd);
18 }
7
tcp_connect
8-17
GET
/
Следующая функция,
start_connect
Листинг 16.11. Инициирование неблокируемой функции connect
//nonblock/start_connect.c
1 #include "web.h"
2 void
3 start_connect(struct file *fptr)
4 {
5 int fd, flags, n;
6 struct addrinfo *ai;
7 ai = Host_serv(fptr->f_host, SERV, 0, SOCK_STREAM);
8 fd = Socket(ai->ai_family; ai->ai_socktype, ai->ai_protocol);
9 fptr->f_fd = fd;
10 printf("start_connect for %s, fd %dn", fptr->f_name, fd);
11 /* отключаем блокирование сокета */
12 flags = Fcntl(fd, F_GETFL, 0);
13 Fcntl(fd, F_SETFL, flags | O_NONBLOCK);
14 /* инициируем неблокируемое соединение с сервером */
15 if ((n = connected, ai->ai_addr, ai->ai_addrlen)) < 0) {
16 if (errno != EINPROGRESS)
17 err_sys("nonblocking connect error");
18 fptr->f_flags = F_CONNECTING;
19 FD_SET(fd, &rset); /* включаем дескриптор сокета в наборе чтения
и записи */
20 FD_SET(fd, &wset);
21 if (fd > maxfd)
22 maxfd = fd;
23 } else if (n >= 0) /* соединение уже установлено */
24 write_get_cmd(fptr); /* отправляем команду GET серверу */
25 }
7-13
host_serv
addrinfo
14-22
connect
F_CONNECTING
select
maxfd
23-24
connect
write_get_cmd
Мы делаем сокет неблокируемым для функции
connect
write
writen
read
select