UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Рис. 16.6. Установление первого соединения, а затем множества параллельных соединений
Для дальнейшей оптимизации клиент может начать обработку данных, возвращаемых по первому соединению, до того, как установление первого соединения завершится, и инициировать дополнительные соединения, как только ему станет известно, что они нужны.
Поскольку мы выполняем несколько неблокируемых функций
connectconnect_nonbНаша программа считывает около 20 строк с веб-сервера. Мы задаем в качестве аргументов командной строки максимальное число параллельных соединений, имя узла сервера, а затем каждое из имен файлов, получаемых с сервера. Типичное выполнение нашей программы выглядит так:
solaris % <b>web % www.foobar.com / image1.gif image2.gif </b><b> image3.gif image4.gif image5.gif </b><b> image6.gif image7.gif</b>Аргументы командной строки задают три одновременных соединения, имя узла сервера, имя файла домашней страницы (
/Это большой пример, поэтому мы будем показывать его частями. В листинге 16.8 представлен наш заголовочный файл
web.hЛистинг 16.8. Заголовок web.h
//nonblock/web.h 1 #include "unp.h" 2 #define MAXFILES 20 3 #define SERV "80" /* номер порта или имя службы */ 4 struct file { 5 char *f_name; /* имя файла */ 6 char *f_host; /* имя узла или адрес IPv4/IPv6 */ 7 int f_fd; /* дескриптор */ 8 int f_flags; /* F_xxx определены ниже */ 9 } file[MAXFILES];10 #define F_CONNECTING 1 /* connect() в процессе выполнения */11 #define F_READING 2 /* соединение установлено; происходит считывание */12 #define F_DONE 4 /* все сделано */13 #define GET_CMD "GET %s HTTP/1.0rnrn"14 /* глобальные переменные */15 int nconn, nfiles, nlefttoconn, nlefttoread, maxfd;16 fd_set rset, wset;17 /* прототипы функций */18 void home_page(const char*, const char*);19 void start_connect (struct file*);20 void write_get_cmd(struct file*);2-13MAXFILESfile14-20Листинг 16.9. Первая часть программы одновременного выполнения функций connect: глобальные переменные и начало функции main
//nonblock/web.c 1 #include "web.h" 2 int 3 main(int argc, char **argv) 4 { 5 int i, fd, n, maxnconn, flags, error; 6 char buf[MAXLINE]; 7 fd_set rs, ws; 8 if (argc < 5) 9 err_quit("usage: web <#conns> <hostname> <homepage> <file1> ...");10 maxnconn = atoi(argv[1]);11 nfiles = min(argc - 4, MAXFILES);12 for (i = 0; i < nfiles; i++) {13 file[i].f_name = argv[i + 4];14 file[i].f_host = argv[2];15 file[i].f_flags = 0;16 }17 printf("nfiles = %dn", nfiles);18 home_page(argv[2], argv[3]);19 FD_ZERO(&rset);20 FD_ZERO(&wset);21 maxfd = -1;22 nlefttoread = nlefttoconn = nfiles;23 nconn = 0;11-17file18home_page
