Литмир - Электронная Библиотека
Содержание  
A
A

Глава 4

Элементарные сокеты TCP

4.1. Введение

В этой главе описываются элементарные функции сокетов, необходимые для написания полностью работоспособного клиента и сервера TCP. Сначала мы опишем все элементарные функции сокетов, которые будем использовать, а затем в следующей главе создадим клиент и сервер. С этими приложениями мы будем работать на протяжении всей книги, постоянно их совершенствуя (см. табл. 1.3 и 1.4).

Мы также опишем параллельные (concurrent) серверы — типичную технологию Unix для обеспечения параллельной обработки множества клиентов одним сервером. Подключение очередного клиента заставляет сервер выполнить функцию

fork
, порождающую новый серверный процесс для обслуживания этого клиента. Здесь применительно к использованию функции
fork
мы будем рассматривать модель «каждому клиенту — один процесс», а в главе 26 при обсуждении программных потоков расскажем о модели «каждому клиенту — один поток».

На рис. 4.1 представлен типичный сценарий взаимодействия, происходящего между клиентом и сервером. Сначала запускается сервер, затем, спустя некоторое время, запускается клиент, который соединяется с сервером. Предполагается, что клиент посылает серверу запрос, сервер этот запрос обрабатывает и посылает клиенту ответ. Так продолжается, пока клиентская сторона не закроет соединение, посылая при этом серверу признак конца файла. Затем сервер закрывает свой конец соединения и либо завершает работу, либо ждет подключения нового клиента.

UNIX: разработка сетевых приложений - img_30.png

Рис. 4.1. Функции сокетов для элементарного клиент-серверного соединения TCP

4.2. Функция socket

Чтобы обеспечить сетевой ввод-вывод, процесс должен начать работу с вызова функции

socket
, задав тип желаемого протокола (TCP с использованием IPv4, UDP с использованием IPv6, доменный сокет Unix и т.д.).

#include <sys/socket.h>

int socket(int <i>family</i>, int <i>type</i>, int <i>protocol</i>);

<i>Возвращает: неотрицательный дескриптор, если функция выполнена успешно, -1 в случае ошибки</i>

Константа

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 показаны допустимые сочетания, а также протокол, соответствующий каждой паре. Клетки таблицы, содержащие «Да», соответствуют допустимым комбинациям, для которых нет удобных сокращений. Пустая клетка означает, что данное сочетание не поддерживается.

Таблица 4.4. Сочетания констант family и type для функции socket

AF_INET AF_INET6 AF_LOCAL AF_ROUTE AF_KEY
SOCK_STREAM TCP/SCTP TCP/SCTP Да
SOCK_DGRAM UDP UDP Да
SOCK_SEQPACKET SCTP SCTP Да
SOCK RAW IPv4 IPv6 Да Да
ПРИМЕЧАНИЕ

В качестве первого аргумента функции socket вы также можете встретить константу PF_xxx. Подробнее об этом мы расскажем в конце данного раздела.

Кроме того, вам может встретиться название AF_UNIX (исторически сложившееся в Unix) вместо AF_LOCAL (название из POSIX), и более подробно мы поговорим об этом в главе 14.

Для аргументов family и type существуют и другие значения. Например, 4.4BSD поддерживает и AF_NS (протоколы Xerox NS, часто называемые XNS), и AF_ISO (протоколы OSI). Но сегодня очень немногие используют какой-либо из этих протоколов. Аналогично, значение type для SOCK_SEQPACKET, сокета последовательных пакетов, реализуется и протоколами Xerox NS, и протоколами OSI. Но протокол TCP является потоковым и поддерживает только сокеты SOCK_STREAM.

Linux поддерживает новый тип сокетов, SOCK_PACKET, предоставляющий доступ к канальному уровню, аналогично BPF и DLPI на рис. 2.1. Об этом более подробно рассказывается в главе 29.

Сокет управления ключами AF_KEY является новшеством. Аналогично тому, как маршрутизирующий сокет (AF_ROUTE) является интерфейсом к таблице маршрутизации ядра, сокет управления ключами — это интерфейс к таблице ключей ядра. Подробнее об этом рассказывается в главе 19.

37
{"b":"225366","o":1}