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-68
write
EWOULDBLOCK
write
68-74
write
froptr
76-90
Теперь мы проверим работу этой функции и операций неблокируемого ввода-вывода. В листинге 16.4 показана наша функция
gf_time
str_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
Здесь специально используется тот же формат, что и для отметок времени, которые выводятся программой
tcpdump
fprintf
str_cli
tcpdump
tcpdump
Например, сначала мы запускаем функцию
tcpdump
solaris
tcpd
solaris % <b>tcpdump -w tcpd tcp and port 7</b>
Затем мы запускаем клиент TCP на этом узле и указываем сервер на узле
linux
solaris % <b>tcpcli02 192.168.1.10 < 2000.lines > out 2> diag</b>
Стандартный поток ввода — это файл
2000.lines
out
diag
solaris % <b>diff 2000.lines out</b>
чтобы убедиться, что отраженные строки идентичны введенным строкам. Наконец, мы прекращаем выполнение функции
tcpdump
tcpdump