UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Рис. Б.3. Адреса 6to4
Преимущество 6to4 перед 6bone состоит в том, что туннели, формирующие инфраструктуру, образуются автоматически. Для их создания не требуется предварительное конфигурирование. Сайт, использующий 6to4, настраивает основной маршрутизатор на известный адрес передачи наиболее подходящему узлу (anycast) IPv4 192.88.99.1 (RFC 3068 [48]). Он соответствует адресу IPv6 2002: :с058:6301::. Маршрутизаторы инфраструктуры IPv6, готовые действовать в качестве шлюзов 6to4, объявляют о маршруте к сети 2002/16 и отправляют упакованный трафик на адрес IPv4, скрытый внутри адреса 6to4. Такие маршрутизаторы могут быть локальными, региональными или глобальными в зависимости от областей действия их маршрутов.
Смысл виртуальных сетей состоит в том, чтобы постепенно исчезнуть с течением времени, когда промежуточные маршрутизаторы обретут требуемую функциональность (в частности, способность работать с IPv6).
Приложение В
Техника отладки
Это приложение содержит некоторые рекомендации и описание методов отладки сетевых приложений. Ни один из приведенных методов не является панацеей от всех возможных проблем, однако существует множество инструментальных средств, с которыми следует ознакомиться, чтобы в дальнейшем использовать подходящие для конкретной среды.
В.1. Трассировка системных вызовов
Многие версии Unix предоставляют возможность трассировки (отслеживания) системных вызовов. Зачастую это может оказаться полезным методом отладки.
Работая на этом уровне, необходимо различать системный вызов и функцию. Системный вызов является точкой входа в ядро, и именно это можно отследить с помощью инструментальных средств, описанных в данном разделе. Стандарт POSIX и большинство других стандартов используют термин функция, вкладывая в это понятие тот же смысл, что и пользователи, хотя на самом деле это может быть системный вызов. Например, в Беркли-ядрах
socketputmsggetmsgВ этом разделе мы рассмотрим системные вызовы, задействованные в работе клиента времени и даты (см. листинг 1.1).
Сокеты ядра BSD
Мы начнем с FreeBSD, операционной системы с Беркли-ядром, в котором все функции сокетов являются системными вызовами. Программа трассировки системных вызовов имеет название
ktracektrace.outkdumpfreebsd % <b>ktrace daytimetcpcli 192.168.42.2</b>Tue Aug 19 23:35.10 2003Затем запускаем
kdump3211 daytimetcpcli CALL socket(0x2,0x1,0)3211 daytimetcpcli RET socket 33211 daytimetcpcli CALL connect(0x3,0x7fdffffe820,0x10)3211 daytimetcpcli RET connect 03211 daytimetcpcli CALL read(0x3,0x7fdffffe830,0x1000)3211 daytimetcpcli GIO fd 3 read 26 bytes "Tue Aug 19 23:35:10 2003 "3211 daytimetcpcli RET read 26/0x1a...3211 daytimetcpcli CALL write(0x1,0x204000,0x1a)3211 daytimetcpcli GIO fd 1 wrote 26 bytes "Tue Aug 19 23:35:10 2003 "3211 daytimetcpcli RET write 26/0x1a3211 daytimetcpcli CALL read(0x3,0x7fdffffe830,0x1000)3211 daytimetcpcli GIO fd 3 read 0 bytes ""3211 daytimetcpcli RET read 03211 daytimetcpcli CALL exit(0)Число 3211 является идентификатором процесса.
CALLRETGIOsocketconnectreadreadСокеты ядра Solaris 9
Операционная система Solaris 2.x основывается на SVR4, и во всех версиях ранее 2.6 сокеты реализуются так, как показано на рис. 31.3. Однако во всех версиях SVR4 с подобными реализациями сокетов существует одна проблема: они редко обеспечивают полную совместимость с сокетами Беркли-ядер. Для обеспечения дополнительной совместимости в Solaris 2.6 способ реализации изменен за счет использования файловой системы
sockfstrusssolaris % <b>truss -v connect daytimetcpcli 127.0.0.1</b>Mon Sep 8 12:16:42 2003После обычного подключения библиотеки осуществляется первый системный вызов
so_socketsocketso_socket(PF_INET, SOCK_STREAM, IPPROTO_IP, 1) = 3connect(3, 0xFFBFDEF0, 16, 1) = 0AF_INET name = 127.0.0.1 port = 13read(3, " M o n S e p 8 1", ... 4096) = 26Mon Sep 8 12:48:06 2003write(1, " M o n S e p 8 1", ... 26) = 26read(3, 0xFFBFDF03, 4096) = 0_exit(0)Первые три аргумента системного вызова
so_socketsocketДалее мы видим, что
connecttruss-v connect
