UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
44 if (optind != argc-2)
45 usage("missing <host> and/or <serv>");
46 /* преобразование имени получателя и службы */
47 aip = Host_serv(argv[optind], argv[optind+1], AF_INET, SOCK_DGRAM);
48 dest = aip->ai_addr; /* не освобождаем память при помощи freeaddrinfo() */
49 destlen = aip->ai_addrlen;
50 /*
51 * Нужен локальный IP-адрес для указания в UDP-дейтаграммах.
52 * Нельзя задать 0 и предоставить выбор уровню IP,
53 * потому что адрес нужен для вычисления контрольной суммы.
54 * Если указан параметр -1, используем заданные при вызове значения.
55 * в противном случае соединяем сокет UDP с адресатом и определяем
56 * правильный адрес отправителя.
57 */
58 if (lopt) {
59 /* преобразование локального имени и сервиса */
60 aip = Host_serv(localname, localport, AF_INET, SOCK_DGRAM);
61 local = aip->ai_addr; /* не вызываем freeaddrinfo() */
62 locallen = aip->ai_addrlen;
63 } else {
64 int s;
65 s = Socket(AF_INET, SOCK_DGRAM, 0);
66 Connect(s, dest, destlen);
67 /* ядро выбирает правильный локальный адрес */
68 locallen = sizeof(locallookup);
69 local = (struct sockaddr*)&locallookup;
70 Getsockname(s, local, &locallen);
71 if (locallookup.sin_addr.s_addr == htonl(INADDR_ANY))
72 err_quit("Can't determine local address - use -ln");
73 close(s);
74 }
75 open_output(); /* открываем поток вывода (символьный сокет или libnet) */
76 open_pcap(); /* открываем устройство захвата пакетов */
77 setuid(getuid()); /* права привилегированного пользователя больше
не нужны */
78 Signal(SIGTERM, cleanup);
79 Signal(SIGINT, cleanup);
80 Signal(SIGHUP, cleanup);
81 test_udp();
82 cleanup(0);
83 }
46-49
host_serv
dest
50-74
local
local
75-76
open_output
libnet
open_pcap
77-80
/dev/bpf
getuid
81-82
test_udp
cleanup
В листинге 29.5 показана функция
open_pcap
main
Листинг 29.5. Функция open_pcap: открытие и инициализация устройства для захвата пакетов
//udpcksum/pcap.c
1 #include "udpcksum.h"
2 #define CMD "udp and src host %s and src port %d"
3 void