4.2. Функция socket
4.2. Функция socket
Чтобы обеспечить сетевой ввод-вывод, процесс должен начать работу с вызова функции socket, задав тип желаемого протокола (TCP с использованием IPv4, UDP с использованием IPv6, доменный сокет Unix и т.д.).
#include <sys/socket.h>
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 показаны допустимые сочетания, а также протокол, соответствующий каждой паре. Клетки таблицы, содержащие «Да», соответствуют допустимым комбинациям, для которых нет удобных сокращений. Пустая клетка означает, что данное сочетание не поддерживается.
Таблица 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.
При успешном выполнении функция socket возвращает неотрицательное целое число, аналогичное дескриптору файла. Мы называем это число дескриптором сокета (socket descriptor), или sockfd. Чтобы получить дескриптор сокета, достаточно указать лишь семейство протоколов (IPv4, IPv6 или Unix) и тип сокета (потоковый, символьный или дейтаграммный). Мы еще не задали ни локальный адрес протокола, ни удаленный адрес протокола.
Данный текст является ознакомительным фрагментом.