UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
15 void init_v6(void);16 void proc_v4(char*, ssize_t, struct msghdr*, struct timeval*);17 void proc_v6(char*, ssize_t., struct msghdr*, struct timeval*);18 void send_v4(void);19 void send_v6(void):20 void readloop(void);21 void sig_alrm(int);22 void tv_sub(struct timeval*, struct timeval*);23 struct proto {24 void (*fproc)(char*, ssize_t, struct msghdr*, struct timeval*);25 void (*fsend)(void);26 void (*finit)(void);27 struct sockaddr *sasend; /* структура sockaddr{} для отправки, полученная от getaddrinfo */28 struct sockaddr *sarecv; /* sockaddr{} для получения */29 socklen_t salen; /* длина sockaddr{} */30 int icmpproto; /* значение IPPROTO_xxx для ICMP */31 } *pr;32 #ifdef IPV633 #include <netinet/ip6.h>34 #include <netinet/icmp6.h>35 #endif1-2223-31protopr32-35Функция
mainЛистинг 28.3. Функция main
//ping/main.c 1 #include "ping.h" 2 struct proto proto_v4 = 3 { proc_v4, send_v4, NULL, NULL, NULL, 0, IPPROTO_ICMP }; 4 #ifdef IPV6 5 struct proto proto_v6 = 6 { proc_v6, send_v6, init_v6, NULL, NULL, 0, IPPROTO_ICMPV6 }; 7 #endif 8 int datalen = 56; /* размер данных в эхо-запросе ICMP */ 9 int10 main(int argc, char **argv)11 {12 int c;13 struct addrinfo *ai;14 char *h;15 opterr = 0; /* отключаем запись сообщений getopt() в stderr */16 while ((с = getopt(argc, argv, "v")) != -1) {17 switch (c) {18 case 'v':19 verbose++;20 break;21 case '?':22 err_quit("unrecognized option %c", c);23 }24 }25 if (optind != argc-1)26 err_quit("usage: ping [ -v ] <hostname>");27 host = argv[optind];28 pid = getpid() & 0xffff; /* поле идентификатора ICMP имеет размер 16 бит */29 Signal(SIGALRM, sig_alrm);30 ai = Host_serv(host, NULL, 0, 0);31 h = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);32 printf("PING %s (%s): %d data bytesn",33 ai->ai_canonname ? ai->ai_canonname : h, h, datalen);34 /* инициализация в соответствии с протоколом */35 if (ai->ai_family == AF_INET) {36 pr = &proto_v4;37 #ifdef IPV638 } else if (ai->ai_family == AF_INET6) {39 pr = &proto_v6;40 if (IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6*)41 ai->ai_addr)->sin6_addr)))42 err_quit("cannot ping IPv4-mapped IPv6 address");43 #endif44 } else45 err_quit("unknown address family %d", ai->ai_family);46 pr->sasend = ai->ai_addr;47 pr->sarecv = Calloc(1, ai->ai_addrlen);48 pr->salen = ai->ai_addrlen;49 readloop();50 exit(0);51 }
