UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
2 void 3 recv_all(int recvfd, socklen_t salen) 4 { 5 int n; 6 char line[MAXLINE + 1]; 7 socklen_t len; 8 struct sockaddr *safrom; 9 safrom = Malloc(salen);10 for (;;) {11 len = salen;12 n = Recvfrom(recvfd, line, MAXLINE, 0, safrom, &len);13 line[n] = 0; /* завершающий нуль */14 printf("from %s: %s", Sock_ntop(safrom, len), line);15 }16 }9recvfrom10-15recvfromПример
Мы запускаем программу в двух системах:
freebsd4macosxfreebsd4 % <b>sendrecv 239.255.1.2 8888</b>from 172.24.37.78:51297: macosx, 21891from 172.24.37.78:51297: macosx, 21891from 172.24.37.78:51297: macosx, 21891from 172.24.37.78:51297: macosx, 21891macosx % <b>sendrecv 239.255.1.2 8888</b>from 172.24.37.94.1215: freebsd4, 55372from 172.24.37.94.1215: freebsd4, 55372from 172.24.37.94.1215: freebsd4, 55372from 172.24.37.94.1215: freebsd4, 5537221.11. SNTP: простой синхронизирующий сетевой протокол
Синхронизирующий сетевой протокол (Network Time Protocol, NTP) — это сложный протокол синхронизации часов в глобальной или локальной сети. Его точность часто может достигать миллисекунд. В RFC 1305 [76] этот протокол подробно описан, а в RFC 2030 [77] рассматривается протокол SNTP — упрощенная версия NTP, предназначенная для узлов, которым не требуется функциональность полной реализации NTP. Типичной является ситуация, когда несколько узлов в локальной сети синхронизируют свои часы через Интернет с другими узлами NTP, а затем распространяют полученное значение времени в локальной сети с использованием либо широковещательной, либо многоадресной передачи.
В этом разделе мы создадим клиент SNTP, который прослушивает широковещательные или групповые сообщения NTP на всех присоединенных сетях, а затем выводит разницу во времени между пакетом NTP и текущим истинным временем узла. Мы не пытаемся изменить это время, поскольку для этого необходимы права привилегированного пользователя.
Файл
ntp.hЛистинг 21.11. Заголовок ntp.h: формат пакета NTP и определения
//ssntp/ntp.h 1 #define JAN_1970 2208988800UL /* 1970 - 1900 в секундах */ 2 struct l_fixedpt { /* 64-разрядное число с фиксированной точкой */ 3 uint32_t int_part; 4 uint32_t fraction; 5 }; 6 struct s_fixedpt { /* 32-разрядное число с фиксированной точкой */ 7 u_short int_part; 8 u_short fraction; 9 };10 struct ntpdata { /* заголовок NTP */11 u_char status;12 u_char stratum;13 u_char ppoll;14 int precision:8;15 struct s_fixedpt distance;16 struct s_fixedpt dispersion;17 uint32_t refid;18 struct l_fixedpt reftime;19 struct l_fixedpt org;20 struct 1_fixedpt rec;21 struct l_fixedpt xmt;22 };23 #define VERSION_MASK 0x3824 #define MODE_MASK 0x0725 #define MODE CLIENT 326 #define MODE_SERVER 427 #define MODE_BROADCAST 52-22 l_fixedpts_fixedptntpdataВ листинге 21.12 пpeдcтaвлeнa функция
mainЛистинг 21.12. Функция main
//ssntp/main.c 1 #include "sntp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int sockfd; 6 char buf[MAXLINE]; 7 ssize_t n; 8 socklen_t salen, len; 9 struct ifi_info *ifi;10 struct sockaddr *mcastsa, *wild, *from;11 struct timeval now;12 if (argc != 2)
