Таблица 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) и тип сокета (потоковый, символьный или дейтаграммный). Мы еще не задали ни локальный адрес протокола, ни удаленный адрес протокола.
Префикс AF_
обозначает семейство адресов ( address family ), a PF_
— семейство протоколов ( protocol family ). Исторически ставилась такая цель, чтобы отдельно взятое семейство протоколов могло поддерживать множество семейств адресов и значение PF_
использовалось для создания сокета, а значение AF_
— в структурах адресов сокетов. Но в действительности семейства протоколов, поддерживающего множество семейств адресов, никогда не существовало, и поэтому в заголовочном файле значение PF_
для протокола задается равным значению AF_
. Хотя не гарантируется, что это равенство будет всегда справедливо, но при попытке изменить ситуацию для существующих протоколов большая часть написанного кода потеряет работоспособность.
ПРИМЕЧАНИЕ
Просмотр 137 программ с вызовами функции socket в реализации BSD/OS 2.1 показывает, что в 143 случаях вызова задается значение AF_, и только в 8 случаях — значение PF_.
Причина создания аналогичных наборов констант с префиксами AF_ и PF_ восходит к 4.1cBSD [69] и к версии функции socket, предшествующей описываемой нами версии (которая появилась с 4.2BSD). Версия функции socket в 4.1cBSD получала четыре аргумента, одним из которых был указатель на структуру sockproto. Первый элемент этой структуры назывался sp_family, и его значение было одним из значений PF_. Второй элемент, sp_protocol, был номером протокола, аналогично третьему аргументу нынешней функции socket. Единственный способ задать семейство протоколов заключался в том, чтобы задать эту структуру. Следовательно, в этой системе значения PF_ использовались как элементы для задания семейства протоколов в структуре sockproto. Значения AF_ играли роль элементов для задания семейства адресов в структурах адресов сокетов. Структура sockproto еще присутствует в 4.4BSD [128, с. 626-627], но служит только для внутреннего использования ядром. Начальное определение содержало для элемента sp_family комментарий «семейство протоколов», но в исходном коде 4.4BSD он был изменен на «семейство адресов».
Читать дальше
Конец ознакомительного отрывка
Купить книгу