UNIX: разработка сетевых приложений
-Т параметр SO_REUSEPORT-U n войти в срочный режим, прежде чем записать число n (только для отправителя)-V использовать writev() вместо write(): включает -k-W игнорировать ошибки записи для клиента приема-X n параметр TCP_MAXSEG (устанавливает MSS)-Y параметр SO_DONTROUTE-Z MSG_PEEK-2 параметр IP_ONESBCAST (255.255.255.255) для широковещательной передачиВ.4. Небольшие тестовые программы
Другим полезным методом отладки, которым автор пользовался при написании книги, является создание небольших тестовых программ, позволяющих увидеть, как работает одно конкретное свойство в тщательно выстроенной тестовой ситуации. При написании небольших тестовых программ полезно иметь набор библиотечных функций-оберток и некоторых простых функций вывода сообщений об ошибках, наподобие тех, что использовались на протяжении всей книги. Такой подход уменьшает размер создаваемого кода и в то же время обеспечивает требуемую проверку ошибок.
В.5. Программа tcpdump
Бесценным средством отладки в сетевом программировании является такая программа, как
. Она считывает пакеты из сети и выводит на экран большое количество информации об этих пакетах. Эта программа также позволяет нам задать некоторые критерии отбора пакетов, в результате чего будут выводиться только пакеты, удовлетворяющие этим критериям. Например,tcpdump% <b>tcpdump '(udp and port daytime) or icmp'</b>выводит только UDP-дейтаграммы с номером порта отправителя или получателя, равным 13 (сервер времени и даты), или ICMP-пакеты. Следующая команда:
% <b>tcpdump 'tcp and port 80 and tcp[13:1] & 2 != 0'</b>выводит только TCP-сегменты с номером порта отправителя или получателя, равным 80 (сервер HTTP), у которых установлен флаг SYN. Флаг SYN имеет значение 2 в 13-м байте от начала TCP-заголовка. Следующая команда:
% <b>tcpdump 'tcp and tcp[0:2] > 7000 and tcp[0:2] <= 7005'</b>выводит только те TCP-сегменты, у которых номер порта отправителя лежит в интервале от 7001 до 7005. Номер порта отправителя занимает 2 байта в самом начале TCP-заголовка (нулевое смещение).
В приложении А книги [111] более подробно описано действие данной программы.
ПРИМЕЧАНИЕЭта программа доступна по адресу http://www.tcpdump.org/ и работает под множеством реализаций Unix. Она написана Ван Якобсоном (Van Jacobson), Крэгом Лересом (Craig Leres) и Стивеном МакКаном (Steven McCanne) из LBL, и в настоящее время сопровождается командой tcpdump.org.
Некоторые поставщики предлагают свои программы, обладающие теми же возможностями. Например, в Solaris 2.x есть программа snoop. Но программа tcpdump функционирует под множеством версий Unix, а возможность использования одного и того же средства в неоднородном окружении является большим преимуществом.
В.6. Программа netstat
В тексте книги много раз использовалась программа
. Эта программа служит для следующих целей.netstat■ Она выводит статус точек доступа сети. Это было показано в разделе 5.6, когда мы прослеживали статус нашей точки доступа при запуске клиента и сервера.
■ Она показывает, к какой группе принадлежит каждый из интерфейсов узла. Обычно для этой цели используется флаг
, а в Solaris 2.x используется флаг-ia.-g■ С параметром
эта программа сообщает статистику по каждому протоколу. Подобный пример был приведен в разделе 8.13, когда мы говорили о недостаточном управлении потоками в UDP.-s■ При использовании параметра
программа выводит таблицу маршрутизации, а с параметром-r— информацию об интерфейсе. Эта возможность была использована в разделе 1.9, когда с помощью программы-iмы выясняли топологию сети.netstatПрограмма
обладает и другими возможностями, а многие поставщики добавляют свои собственные. Обратитесь к руководству по вашей системе.netstatВ.7. Программа lsof
Название
происходит от «list open files» (перечислить открытые файлы). Как иlsof, эта программа является общедоступной и представляет собой удобное средство для отладки, которое было перенесено на множество версий Unix.tcpdumpОдним из общих способов применения программы
при работе в сети является выявление процесса, имеющего открытый сокет, по указанному IP-адресу или порту. Программаlsofпозволяет выяснить, какой IP-адрес или порт используется, а также узнать состояние TCP-соединения, но она не позволяет идентифицировать процесс. Например, чтобы определить, какой процесс запустил сервер времени и даты, выполним следующую команду:netstatsolaris % <b>lsof -i TCP:daytime</b>COMMAND PID USER FD TYPE DEVICE SIZE/OFF INODE NAMEinetd 222 root 15u inet 0xf5a801f8 0t0 TCP *:daytimeВ выводе приводятся следующие данные: команда (данный сервис обеспечивается сервером
), идентификатор процесса, владелец процесса, дескриптор (15 и u означает, что он открыт на чтение и на запись), тип сокета, адрес протокола блока управления, размер смещения файла (не имеет значения для сокета), тип протокола и имя.inetdЕще один из традиционных случаев применения данной программы имеет место, когда мы запускаем сервер, который связывает свой заранее известный порт и получает ошибку, указывающую, что адрес уже используется. Тогда мы запускаем программу
, чтобы выяснить, каким процессом используется данный порт.lsofПоскольку программа
сообщает об открытых файлах, она не может сообщать о точках доступа, не ассоциированных с открытым файлом, то есть точках доступа TCP в состоянии TIME_WAIT.lsofПРИМЕЧАНИЕПрограмма находится по адресу ftp://vic.cc.purdue.edu/pub/tools/unix/lsof. Она написана Виком Абелем (Vic Abell).
Некоторые поставщики предлагают свои программы с похожими возможностями. Например, в BSD/OS предлагается программа fstat. Однако программа lsof работает под множеством версий Unix, а использование одного инструмента в неоднородном окружении вместо подбора различных средств для каждой среды является большим преимуществом.
Приложение Г
Различные исходные коды
Г.1. Заголовочный файл unp.h
Почти каждая программа в этой книге начинается с подключения заголовочного файла
, показанного в листинге Г.1 [1]. Этот файл подключает все стандартные системные заголовочные файлы, необходимые для работы большинства программ, а также некоторые общие системные заголовочные файлы. В нем также определены такие константы, какunp.h, прототипы функций ANSI С для тех функций, которые мы определяем в тексте (например,MAXLINE), и все используемые нами функции-обёртки. Сами прототипы в приведенном ниже листинге мы не показываем.readline