– w n количество байтов для каждой записи (write) клиента "рассылки"
(по умолчанию 1024)
– x n время (в ms) для SO_RCVTIMEO (получение тайм-аута)
– y n время (в ms) для SO_SNDTIMEO (отправка тайм-аута)
– A параметр SO_REUSEADDR
– B параметр SO_BROADCAST
– D параметр SO_DEBUG
– E параметр IP_RECVDSTADDR
– F порождение дочерних процессов (fork)
после установления соединения
(параллельный TCP-сервер)
– G a.b.c.d жесткая маршрутизация
– H n параметр IP_TOS (16=min del, 8=max thru, 4=max rel, 2=min cost)
– I сигнал SIGIO
– J n параметр IP_TTL
– K параметр SO_KEEPALIVE
– L n параметр SO_LINGER, n = linger time
– N параметр TCP_NODELAY
– O n время (в мс) для ожидания после вызова listen, но перед первым приемом (accept)
– Р n время (в мс) перед первым считыванием или записью (рассылка/прием)
– Q n время (в мс) ожидания после получения FIN, но перед закрытием
– R n параметр SO_RCVBUF
– S n параметр SO_SNDBUF
– Т параметр 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
. Она считывает пакеты из сети и выводит на экран большое количество информации об этих пакетах. Эта программа также позволяет нам задать некоторые критерии отбора пакетов, в результате чего будут выводиться только пакеты, удовлетворяющие этим критериям. Например,
% tcpdump '(udp and port daytime) or icmp'
выводит только UDP-дейтаграммы с номером порта отправителя или получателя, равным 13 (сервер времени и даты), или ICMP-пакеты. Следующая команда:
% tcpdump 'tcp and port 80 and tcp[13:1] & 2 != 0'
выводит
только TCP-сегменты с номером порта отправителя или получателя, равным 80 (сервер HTTP), у которых установлен флаг SYN. Флаг SYN имеет значение 2 в 13-м байте от начала TCP-заголовка. Следующая команда:
% tcpdump 'tcp and tcp[0:2] > 7000 and tcp[0:2] <= 7005'
выводит только те TCP-сегменты, у которых номер порта отправителя лежит в интервале от 7001 до 7005. Номер порта отправителя занимает 2 байта в самом начале TCP-заголовка (нулевое смещение).
В приложении А книги [111] более подробно описано действие данной программы.
ПРИМЕЧАНИЕ
Эта программа доступна по адресуи работает под множеством реализаций Unix. Она написана Ван Якобсоном (Van Jacobson), Крэгом Лересом (Craig Leres) и Стивеном МакКаном (Steven McCanne) из LBL, и в настоящее время сопровождается командой tcpdump.org.
Некоторые поставщики предлагают свои программы, обладающие теми же возможностями. Например, в Solaris 2.x есть программа snoop. Но программа tcpdump функционирует под множеством версий Unix, а возможность использования одного и того же средства в неоднородном окружении является большим преимуществом.
В.6. Программа netstat
В тексте книги много раз использовалась программа
netstat
. Эта программа служит для следующих целей.
Она выводит статус точек доступа сети. Это было показано в разделе 5.6, когда мы прослеживали статус нашей точки доступа при запуске клиента и сервера.
Она показывает, к какой группе принадлежит каждый из интерфейсов узла. Обычно для этой цели используется флаг
– ia
, а в Solaris 2.x используется флаг
– g
.
С параметром
– s
эта программа сообщает статистику по каждому протоколу. Подобный пример был приведен в разделе 8.13, когда мы говорили о недостаточном управлении потоками в UDP.
При использовании параметра
– r
программа выводит таблицу маршрутизации, а с параметром
– i
— информацию об интерфейсе. Эта возможность была использована в разделе 1.9, когда с помощью программы
netstat
мы выясняли топологию сети.
Программа
netstat
обладает и другими возможностями, а многие поставщики добавляют свои собственные. Обратитесь к руководству по вашей системе.
В.7. Программа lsof
Название
lsof
происходит от «list open files» (перечислить открытые файлы). Как и
tcpdump
, эта программа является общедоступной и представляет собой удобное средство для отладки, которое было перенесено на множество версий Unix.
Одним из общих способов применения программы
lsof
при работе в сети является выявление процесса, имеющего открытый сокет, по указанному IP-адресу или порту. Программа
netstat
позволяет выяснить, какой IP-адрес или порт используется, а также узнать состояние TCP-соединения, но она не позволяет идентифицировать процесс. Например, чтобы определить, какой процесс запустил сервер времени и даты, выполним следующую команду: