UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Функция
send_dns_querylibnetsend_dns_queryudp_writeЛистинг 29.16. Функция send_dns_query, использующая libnet
//udpcksum/senddnsquery-libnet.c18 void19 send_dns_query(void)20 {21 char qbuf[24], *ptr;22 u_int16_t one;23 int packet_size = LIBNET_UDP_H + LIBNET_DNSV4_H + 24;24 static libnet_ptag_t ip_tag, udp_tag, dns_tag;25 /* построение запроса внутри UDP-пакета */26 ptr = qbuf;27 memcpy(ptr, " 01a 14root-servers 03net 00", 20);28 ptr += 20;29 one = htons(1);30 memcpy(ptr, &one, 2); /* тип запроса = A */31 ptr += 2;32 memcpy(ptr, &one, 2); /* класс запроса = 1 (IP-адрес) */33 /* формирование пакета DNS */34 dns_tag = libnet_build_dnsv4(35 1234 /* идентификатор */,36 0x0100 /* флаги: рекурсия разрешена */,37 1 /* кол-во запросов */, 0 /* кол-во записей в ответе */,38 0 /* кол-во авторитетных записей */, 0 /* кол-во дополнительных */,39 qbuf /* запрос */,40 24 /* длина запроса */, 1, dns_tag);41 /* формирование заголовка UDP */42 udp_tag = libnet_build_udp(43 ((struct sockaddr_in*)local)->44 sin_port /* порт отправителя */,45 ((struct sockaddr_in*)dest)->46 sin_port /* порт получателя */,47 packet_size /* длина */, 0 /* контрольная сумма */,48 NULL /* полезные данные */, 0 /* длина полезн. данных */, l, udp_tag);49 /* Так как мы установили контр. сумму равной нулю, libnet автоматически */50 /* рассчитает контр. сумму UDP. Эту функцию можно отключить. */51 if (zerosum)52 if (libnet_toggle_checksum(l, udp_tag, LIBNET_OFF) < 0)53 err_quit("turning off checksums: %sn", libnet_geterror(l));54 /* формирование IP-заголовка */55 ip_tag = libnet_build_ipv4(packet_size + LIBNET_IPV4_H /* длина */,56 0 /* tos */, 0 /* IP ID */, 0 /* фрагмент*/,57 TTL_OUT /* ttl */, IPPROTO_UDP /* протокол */,58 0 /* контр. сумма */,59 ((struct sockaddr_in*)local)->sin_addr.s_addr /* отправитель */,60 ((struct sockaddr_in*)dest)->sin_addr.s_addr /* получатель */,61 NULL /* полезные данные */, 0 /* длина полезн. данных */, l, ip_tag);62 if (libnet_write(l) < 0) {63 err_quit("libnet_write: %sn", libnet_geterror(l));64 }65 if (verbose)66 printf("sent: %d bytes of datan", packet_size);67 }25-3234-40libnet_build_dnsv442-48libnet_build_udplibnet49-52libnet53-65libnet_build_ipv4Библиотека libnet автоматически записывает поле ip_len в нужном порядке байтов. Это пример повышения переносимости программы благодаря использованию библиотек.
66-70libnet_writeФункция
send_dns_querylibnet29.8. Резюме
Символьные сокеты предоставляют возможность записывать и считывать IP-дейтаграммы, которые могут быть не поняты ядром, а доступ к канальному уровню позволяет считывать и записывать кадры канального уровня любых типов (не только дейтаграммы IP). Программа
tcpdumpВ различных операционных системах применяются различные способы доступа к канальному уровню. Мы рассмотрели пакетный фильтр Беркли, DLPI SVR4 и пакетные сокеты Linux (
SOCK_PACKETlibcap
