UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
4 { 5 ssize_t n, rc; 6 char c, *ptr; 7 ptr = vptr; 8 for (n = 1; n < maxlen; n++) { 9 again:10 if ((rc = read(fd, &c, 1)) == 1) {11 *ptr++ = c;12 if (c == 'n')13 break; /* записан символ новой строки, как в fgets() */14 } else if (rc == 0) {15 if (n == 1)16 return (0); /* EOF, данные не считаны */17 else18 break; /* EOF, некоторые данные были считаны */19 } else {20 if (errno == EINTR)21 goto again;22 return (-1); /* ошибка, errno задается функцией read() */23 }24 }25 *ptr = 0; /* завершаем нулем, как в fgets() */26 return (n);27 }Если функция чтения или записи (
readwritereadwriteВ разделе 14.3 мы покажем, что вызов функции
recvMSG_WAITALLreadnЗаметим, что наша функция
readlinereadstdiostdiostdiostdiostdioСуществует множество сетевых протоколов, основанных на использовании строк текста: SMTP, HTTP, FTP, finger. Поэтому соблазн работать со строками будет терзать вас достаточно часто. Наш совет: мыслить в терминах буферов, а не строк. Пишите код таким образом, чтобы считывать содержимое буфера, а не отдельные строки. Если же ожидается получение строки, ее всегда можно поискать в считанном буфере.
В листинге 3.12 приведена более быстрая версия функции
readlinestdioreadlineselectreadlineselectreadlinereadnreadlinereadnЛистинг 3.12. Улучшенная версия функции readline
//lib/readline.c 1 #include "unp.h" 2 static int read_cnt; 3 static char *read_ptr; 4 static char read_buf[MAXLINE]; 5 static ssize_t 6 my_read(int fd, char *ptr) 7 { 8 if (read_cnt <= 0) { 9 again:10 if ((read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {11 if (errno == EINTR)12 goto again;13 return(-1);14 } else if (read_cnt == 0)15 return(0);16 read_ptr = read_buf;17 }18 read_cnt--;19 *ptr = *read_ptr++;20 return(1);21 }22 ssize_t
