Уильям Стивенс - UNIX: разработка сетевых приложений
- Название:UNIX: разработка сетевых приложений
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:5-94723-991-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Структуры адресов сокетов являются самоопределяющимися, поскольку они всегда начинаются с поля family, которое идентифицирует семейство адресов, содержащихся в структуре. Более новые реализации, поддерживающие структуры адресов сокетов переменной длины, также содержат поле, которое определяет длину всей структуры.
Две функции, преобразующие IP-адрес из формата представления (который мы записываем в виде последовательности символов ASCII) в численный формат (который входит в структуру адреса сокета) и обратно, называются inet_ptonи inet_ntop. Эти функции являются зависящими от протокола. Более совершенной методикой является работа со структурами адресов сокетов как с непрозрачными (opaque) объектами, когда известны лишь указатель на структуру и ее размер. Мы разработали набор функций sock_, которые помогут сделать наши программы не зависящими от протокола. Создание наших не зависящих от протокола средств мы завершим в главе 11 функциями getaddrinfoи getnameinfo.
Сокеты TCP предоставляют приложению поток байтов, лишенный маркеров записей. Возвращаемое значение функции read может быть меньше запрашиваемого, но это не обязательно является ошибкой. Чтобы упростить считывание и запись потока байтов, мы разработали три функции readn, writenи readline, которые и используем в книге. Однако сетевые программы должны быть написаны в расчете на работу с буферами, а не со строками.
Упражнения
1. Почему аргументы типа «значение-результат», такие как длина структуры адреса сокета, должны передаваться по ссылке?
2. Почему и функция readn, и функция writenкопируют указатель void*в указатель char*?
3. Функции inet_atonи inet_addrхарактеризуются традиционно нестрогим отношением к тому, что они принимают в качестве точечно-десятичной записи адреса IPv4: допускаются от одного до четырех десятичных чисел, разделенных точками; также допускается задавать шестнадцатеричное число с помощью начального 0xили восьмеричное число с помощью начального 0 (выполните команду telnet 0xe, чтобы увидеть поведение этих функций). Функция inet_ptonнамного более строга в отношении адреса IPv4 и требует наличия именно четырех чисел, разделенных точками, каждое из которых является десятичным числом от 0 до 255. Функция inet_ptonне разрешает задавать точечно- десятичный формат записи адреса, если семейство адресов — AF_INET6, хотя существует мнение, что это можно было бы разрешить, и тогда возвращаемое значение было бы адресом IPv4, преобразованным к виду IPv6 (см. рис. А.6). Напишите новую функцию inet_pton_loose, реализующую такой сценарий: если используется семейство адресов AF_INETи функция inet_ptonвозвращает нуль, вызовите функцию inet_atonи посмотрите, успешно ли она выполнится. Аналогично, если используется семейство адресов AF_INET6и функция inet_ptonвозвращает нуль, вызовите функцию inet_aton, и если она выполнится успешно, возвратите адрес IPv4, преобразованный к виду IPv6.
Глава 4
Элементарные сокеты TCP
4.1. Введение
В этой главе описываются элементарные функции сокетов, необходимые для написания полностью работоспособного клиента и сервера TCP. Сначала мы опишем все элементарные функции сокетов, которые будем использовать, а затем в следующей главе создадим клиент и сервер. С этими приложениями мы будем работать на протяжении всей книги, постоянно их совершенствуя (см. табл. 1.3 и 1.4).
Мы также опишем параллельные (concurrent) серверы — типичную технологию Unix для обеспечения параллельной обработки множества клиентов одним сервером. Подключение очередного клиента заставляет сервер выполнить функцию fork, порождающую новый серверный процесс для обслуживания этого клиента. Здесь применительно к использованию функции forkмы будем рассматривать модель «каждому клиенту — один процесс », а в главе 26 при обсуждении программных потоков расскажем о модели «каждому клиенту — один поток ».
На рис. 4.1 представлен типичный сценарий взаимодействия, происходящего между клиентом и сервером. Сначала запускается сервер, затем, спустя некоторое время, запускается клиент, который соединяется с сервером. Предполагается, что клиент посылает серверу запрос, сервер этот запрос обрабатывает и посылает клиенту ответ. Так продолжается, пока клиентская сторона не закроет соединение, посылая при этом серверу признак конца файла. Затем сервер закрывает свой конец соединения и либо завершает работу, либо ждет подключения нового клиента.
Рис. 4.1. Функции сокетов для элементарного клиент-серверного соединения TCP
4.2. Функция socket
Чтобы обеспечить сетевой ввод-вывод, процесс должен начать работу с вызова функции socket, задав тип желаемого протокола (TCP с использованием IPv4, UDP с использованием IPv6, доменный сокет Unix и т.д.).
#include
int socket(int family , int type , int protocol );
Возвращает: неотрицательный дескриптор, если функция выполнена успешно, -1 в случае ошибки
Константа familyзадает семейство протоколов. Ее возможные значения приведены в табл. 4.1. Часто этот параметр функции socketназывают «областью» или «доменом» ( domain ), а не семейством. Значения константы type(тип) перечислены в табл. 4.2. Аргумент protocolдолжен быть установлен в соответствии с используемым протоколом (табл. 4.3) или должен быть равен нулю для выбора протокола, по умолчанию соответствующего заданному семейству и типу.
Таблица 4.1. Константы протокола (family) для функции socket
| Семейство сокетов (family) | Описание |
|---|---|
| AF_INET | Протоколы IPv4 |
| AF_INET6 | Протоколы IPv6 |
| AF_LOCAL | Протоколы доменных сокетов Unix (см. главу 14) |
| AF_ROUTE | Маршрутизирующие сокеты (см. главу 17) |
| AF_KEY | Сокет управления ключами |
Таблица 4.2. Тип сокета для функции socket
| Тип (type) | Описание |
|---|---|
| SOCK STREAM | Потоковый сокет |
| SOCK_DGRAM | Сокет дейтаграмм |
| SOCK_SEQPACKET | Сокет последовательных пакетов |
| SOCK_RAW | Символьный (неструктурированный) сокет |
Таблица 4.3. Возможные значения параметра protocol
| Protocol | Значение |
|---|---|
| IPPROTO_TCP | Транспортный протокол TCP |
| IPPROTO_UDP | Транспортный протокол UDP |
| IPPROTO_SCTP | Транспортный протокол SCTP |
Не все сочетания констант familyи typeдопустимы. В табл. 4.4 показаны допустимые сочетания, а также протокол, соответствующий каждой паре. Клетки таблицы, содержащие «Да», соответствуют допустимым комбинациям, для которых нет удобных сокращений. Пустая клетка означает, что данное сочетание не поддерживается.
Интервал:
Закладка: