UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
void sock_set_wild(struct sockaddr *<i>sockaddr</i>, socklen_t <i>addrlen</i>);Функция
sock_bind_wildsock_cmp_addrsock_cmp_portsock_get_portsock_ntop_hostsock_set_addrptrsock_set_portsock_set_wild3.9. Функции readn, writen и readline
Потоковые сокеты (например, сокеты TCP) демонстрируют с функциями
readwritereadwritereadwritereadwritewritewritenВведем три функции для чтения и записи в потоковый сокет.
#include "unp.h"ssize_t readn(int <i>filedes</i>, void *<i>buff</i>, size_t <i>nbytes</i>);ssize_t writen(int <i>filedes</i>, const void *<i>buff</i>, size_t <i>nbytes</i>);ssize_t readline(int <i>filedes</i>, void *<i>buff</i>, size_t <i>maxlen</i>);<i>Все функции возвращают: количество считанных или записанных байтов, -1 в случае ошибки</i>В листинге 3.9 представлена функция
readnwritenreadlineЛистинг 3.9. Функция readn: считывание n байт из дескриптора
//lib/readn.c 1 #include "unp.h" 2 ssize_t /* Считывает n байт из дескриптора */ 3 readn(int fd, void *vptr, size_t n) 4 { 5 size_t nleft; 6 ssize_t nread; 7 char *ptr; 8 ptr = vptr; 9 nleft = n;10 while (nleft > 0) {11 if ((nread = read(fd, ptr, nleft)) < 0) {12 if (errno == EINTR)13 nread = 0; /* и вызывает снова функцию read() */14 else15 return (-1);16 } else if (nread == 0)17 break; /* EOF */18 nleft -= nread;19 ptr += nread;20 }21 return (n - nleft); /* возвращает значение >= 0 */22 }Листинг 3.10. Функция writen: запись n байт в дескриптор
//lib/writen.c 1 #include "unp.h" 2 ssize_t /* Записывает n байт в дескриптор */ 3 writen(int fd, const void *vptr, size_t n) 4 { 5 size_t nleft; 6 ssize_t nwritten; 7 const char *ptr; 8 ptr = vptr; 9 nleft = n;10 while (nleft > 0) {11 if ((nwritten = write(fd, ptr, nleft)) <= 0) {12 if (errno == EINTR)13 nwritten = 0; /* и снова вызывает функцию write() */14 else15 return (-1); /* ошибка */16 }17 nleft -= nwritten;18 ptr += nwritten;19 }20 return (n);21 }Листинг 3.11. Функция readline: считывание следующей строки из дескриптора, по одному байту за один раз
//test/readline1.с 1 #include "unp.h" /* Ужасно медленная версия, приводится только для примера */ 2 ssize_t 3 readline(int fd, void *vptr, size_t maxlen)
