UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
69 } else {70 fprintf(stderr, "%s: wrote %d bytes to stdoutn",71 gf_time(), nwritten);72 froptr += nwritten; /* только что полученное из функции write число */73 if (froptr == friptr)74 froptr = friptr - fr; /* назад к началу буфера */75 }76 }77 if (FD_ISSET(sockfd, &wset) && ((n - toiptr - tooptr) > 0)) {78 if ((nwritten = write(sockfd, tooptr, n)) < 0) {79 if (errno != EWOULDBLOCK)80 err_sys("write error to socket");81 } else {82 fprintf(stderr, "%s: wrote %d bytes to socketn",83 gf_time(), nwritten);84 tooptr += nwritten; /* только что полученное из функции write число */85 if (tooptr == toiptr) {86 toiptr - tooptr = to; /* назад к началу буфера */87 if (stdineof)88 Shutdown(sockfd, SHUT_WR); /* посылаем FIN */89 }90 }91 }92 }93 }65-68writeEWOULDBLOCKwrite68-74writefroptr76-90Теперь мы проверим работу этой функции и операций неблокируемого ввода-вывода. В листинге 16.4 показана наша функция
gf_timestr_cliЛистинг 16.4. Функция gf_time: возвращение указателя на строку времени
//lib/gf_time.c 1 #include "unp.h" 2 #include <time.h> 3 char* 4 gf_time(void) 5 { 6 struct timeval tv; 7 static char str[30]; 8 char *ptr; 9 if (gettimeofday(&tv, NULL) < 0)10 err_sys("gettimeofday error");11 ptr = ctime(&tv.tv_sec);12 strcpy(str, &ptr[11]);13 /* Fri Sep 13 00:00:00 1986n */14 /* 0123456789012345678901234 5 */15 snprintf(str + 8, sizeof(str) - 8, ".%06ld", tv.tv_usec);15 return (str);17 }Эта функция возвращает строку, содержащую текущее время с точностью до микросекунд, в таком формате:
12:34:56.123456Здесь специально используется тот же формат, что и для отметок времени, которые выводятся программой
tcpdumpfprintfstr_clitcpdumptcpdumpНапример, сначала мы запускаем функцию
tcpdumpsolaristcpdsolaris % <b>tcpdump -w tcpd tcp and port 7</b>Затем мы запускаем клиент TCP на этом узле и указываем сервер на узле
linuxsolaris % <b>tcpcli02 192.168.1.10 < 2000.lines > out 2> diag</b>Стандартный поток ввода — это файл
2000.linesoutdiagsolaris % <b>diff 2000.lines out</b>чтобы убедиться, что отраженные строки идентичны введенным строкам. Наконец, мы прекращаем выполнение функции
tcpdumptcpdump
