Об авторе
Шон Уолтон получил степень магистра компьютерных наук в 1990 г. в университете Бригема Янга, штат Юта, специализируясь в области теории языков программирования и многозадачности. В 1988 г. он начал работать на факультете вычислительной техники этого же университета в качестве консультанта по разработке теории и методов управления транспьютерами. Перейдя на должность системного администратора факультета, он впервые столкнулся с программированием BSD-сокетов. Впоследствии, будучи сотрудником компании Hewlett-Packard, он разработал средство автоматического распознавания языка (PostScript и PCL), применяемое в принтерах LaserJet 4 и более поздних моделей. Шон также создал микрооперационную систему реального времени для микроконтроллера 8052, которая эмулировала процессоры принтеров.
Шон много лет профессионально занимался программированием и администрированием UNIX, включая операционные системы Linux, HP-UX, Ultrix, SunOS и System V. Работая со столь разнообразными системами, он сосредоточивал свои усилия на создании методик системно-независимого программирования, позволявших писать приложения, без труда переносимые в любую из систем.
В последние несколько лет Шон вел курсы и читал лекции по основам вычислительной техники, управлению проектами, объектно-ориентированному проектированию, языкам Java и C++. В начале 1998 г. он начал заниматься программированием сокетов в Java и позднее включил этот предмет в свой курс лекций по Java. В настоящее время он сотрудничает с компанией Nationwide Enterprise и параллельно занимается преподавательской деятельностью.
Введение
Расширение опыта программирования
Большинство задач, которые приходится решать программисту в повседневной жизни, связано с выполнением локальных действий в системе. Обычно они не выходят за рамки управления мышью, клавиатурой, экраном и файловой системой. Гораздо труднее заставить взаимодействовать несколько программ, которые работают на разных компьютерах, подключенных к сети. Сетевое программирование, несомненно, обогатит ваш опыт, так как вам придется координировать работу множества компонентов приложения и тщательно распределять обязанности между ними.
Фундаментальной единицей всего сетевого программирования в Linux (и большинстве других операционных систем) является сокет. Так же, как функции файлового ввода-вывода определяют интерфейс взаимодействия с файловой системой, сокет соединяет программу с сетью. С его помощью она посылает и принимает сообщения.
Создавать сетевые приложения труднее, чем даже заниматься многозадачным программированием, так как круг возникающих проблем здесь гораздо шире. Необходимо обеспечивать максимальную производительность, координировать обмен данными и управлять вводом-выводом.
В книге рассматривается множество методик и способов решения этих проблем. Она содержит как ответы на конкретные вопросы, так и описание общих стратегий построения профессиональных сетевых программ.
Структура книги
Книга состоит из пяти частей, каждая из которых связана с предыдущим материалом.
- Часть I, "Создание сетевых клиентских приложений"
- Представлены вводные сведения о сокетах, определены основные термины, описаны различные типы сокетов и принципы адресации, изложена базовая теория сетей.
- Часть II, "Создание серверных приложений"
- Рассматриваются серверные технологии, алгоритмы многозадачности, механизмы ввода-вывода и параметры сокетов.
- Часть III, "Объектно-ориентированные сокеты"
- Язык C — это не единственный язык программирования сокетов. В этой части рассматриваются объектно-ориентированные подходы к сетевому программированию и описываются достоинства и недостатки объектной технологии в целом.
- Часть IV, "Сложные сетевые методики"
- Рассматриваются сложные методики сетевого программирования, включая безопасность, широковещание и групповое вещание, стандарт IPv6 и низкоуровневые сокеты.
- Часть V, "Приложения"
- В приложения вынесен справочный материал, касающийся сокетов. В приложение А включены таблицы, которые слишком велики для основных глав. В приложениях Б и В описаны системные функции работы с сокетами и функции ядра.
На сопровождающем Web-узле содержатся исходные тексты всех примеров книги, приложения в формате HTML и PDF, а также различные RFC-документы в формате HTML.
Предпочтения профессионалов
Данная книга предназначена для профессиональных программистов. Обычно профессионалам нужно одно из трех: либо изучить новую технологию, либо решить конкретную задачу, либо найти нужные примеры или определения. Главы и приложения книги построены с учетом этих потребностей.
- Последовательное чтение от начала до конца. В любом месте книги раскрывается какая-то одна методика. Каждый раздел и глава основаны на предыдущем материале. Вся книга организована по принципу нарастания сложности. Программирование сокетов может показаться поначалу довольно простой задачей. Однако с ним связано множество "подводных камней" и нюансов, пренебрежение которыми приведет к тому, что отличная программа на самом деле окажется неработоспособной.
- Принцип обзора. Человек, читающий книгу, хочет быстро получить интересующую его информацию, не останавливаясь на чрезмерных деталях. Основные сведения у него уже есть, и он хочет сразу перейти к главному. Читатель может пропускать разделы до тех пор, пока не найдет то, что ему нужно.
- Справочный материал. Экспертам, как правило, требуется быстро найти то, что им нужно (таблицы, фрагменты программ, описания API-функций). Эта информация должна быть лаконичной и легкодоступной.
Многие главы содержат врезки, в которых приводится вспомогательная информация, экспертные замечания и советы.
Что необходимо знать
В книге приводится много примеров программ, иллюстрирующих ту или иную методику. Чтобы работать с ними, необходимо знать следующее:
- как создать исходный файл на языке C или Java (в любом доступном редакторе);
- как скомпилировать полученный файл;
- как запустить скомпилированную программу.
Некоторые примеры требуют модификации ядра (для режимов широковещания и группового вещания). В большинстве дистрибутивов Linux сетевая подсистема инсталлирована и запущена, даже если компьютер не подключен к сети. Чтобы иметь возможность запускать все программы, описанные в книге, необходимо:
- уметь создавать и компилировать исходные тексты на языках C, C++ и Java;
- иметь в наличии все необходимые компиляторы;
- уметь конфигурировать ядро;
- уметь компилировать и инсталлировать новое ядро.