Scroll to navigation

SOCKET(2) Руководство программиста Linux SOCKET(2)

НАЗВАНИЕ

socket - создать оконечную точку коммуникации

КРАТКАЯ СВОДКА

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

ОПИСАНИЕ

socket создает оконечную точку для коммуникации и возвращает её дескриптор.

Параметр domain задает "домен" коммуникации; выбирает набор протоколов, которые будут использоваться для коммуникации. Такие наборы описаны в <sys/socket.h>. В настоящее время понимаются такие форматы:

Название Назначение Страница
PF_UNIX,PF_LOCAL Локальная коммуникация unix (7)
PF_INET IPv4, протоколы Интернет ip (7)
PF_INET6 IPv6, протоколы Интернет
PF_IPX IPX - протоколы Novell
PF_NETLINK Устройство для общения пользователя с ядром netlink (7)
PF_X25 Протокол ITU-T X.25 / ISO-8208 x25 (7)
PF_AX25 Протокол AX.25, любительское радио
PF_ATMPVC ATM -- доступ к низкоуровневым PVC
PF_APPLETALK Appletalk ddp (7)
PF_PACKET Низкоуровневый пакетный интерфейс packet (7)

Сокет имеет указанный тип, type, задающий семантику коммуникации. В настоящее время определены следующие типы:

Обеспечивает надежные, двунаправленные последовательные потоки байтов, с поддержкой соединений. Может также поддерживаться механизм вне-поточных данных.
Обеспечивает датаграммы (ненадежные сообщения с ограниченной максимальной длиной, без поддержки соединения).
Обеспечивает последовательный двунаправленный канал передачи датаграмм с поддержкой соединений; датаграммы имеют ограниченную максимальную длину; от получателя требуется за один раз прочитать целый пакет.
Обеспечивает доступ к низкоуровневому сетевому протоколу.
Обеспечивает надежную доставку датаграмм без гарантии их последовательности.
Устарело и не должно использоваться в новых программах; см. packet(7).

Некоторые типы сокетов могут не быть реализованными в некоторых наборах протоколов; например, SOCK_SEQPACKET не реализовано в наборе AF_INET.

Параметр protocol задает конкретный протокол, который используется на сокете. Обычно существует только один протокол, обеспечивающий конкретный тип сокета в заданном наборе протоколов. Однако, возможно существование нескольких таких протоколов -- тогда и используется этот параметр. Номер протокола зависит от используемого “домена коммуникации”, см.  protocols(5). См. getprotoent(3), где описано, как сопоставлять имена протоколов их номерам.

Сокеты типа SOCK_STREAM являются дуплексными потоками байт, похожими на трубы. Они не сохраняют границы между записями. Потоковый сокет должен быть в соединённом состоянии перед тем, как по нему можно отсылать и принимать данные. Соединение с другим сокетом создается с помощью системного вызова connect(2). После соединения данные можно передавать, используя системные вызовы read(2) и write(2), или какой-то из вариантов системных вызовов send(2) и recv(2). Когда сессия закончена, выполняется close(2). Вне-поточные данные могут передаваться, как описано в send(2), а приниматься, как описано в recv(2).

Коммуникационные протоколы, которые реализуют SOCK_STREAM, следят, чтобы данные не были потеряны или продублированы. Если у корреспондента имеется место в буфере, но очередная порция данных не может быть передана за разумное время, то соединение считается мертвым. Когда на сокете включен флаг SO_KEEPALIVE, протокол каким-либо способом проверяет, что другая сторона ещё жива. Сигнал SIGPIPE появляется, если процесс посылает или принимает данные, пользуясь разорванным потоком; это приводит к тому, что неопытные процессы, не обрабатывающие сигнал, завершаются. Сокеты SOCK_SEQPACKET используют те же самые системные вызовы, что и сокеты SOCK_STREAM. Единственное отличие в том, что вызовы read(2) вернут только запрошенное количество данных, а остаток прибывшего пакета будет отброшен. Границы между сообщениями во входящих датаграммах сохраняются.

Сокеты SOCK_DGRAM и SOCK_RAW позволяют посылать датаграммы корреспондентам, заданным при вызове send(2). Датаграммы обычно принимаются с помощью вызова recvfrom(2), который возвращает следующую датаграмму с соответствующим обратным адресом.

SOCK_PACKET --- это устаревший тип сокета, позволявший получать необработанные пакеты прямо от драйвера устройства. Используйте вместо него packet(7).

Системный вызов fcntl(2) с аргументом F_SETOWN может использоваться, чтобы задать группу процессов, которая будет получать сигнал SIGURG, когда прибывают вне-поточные данные или сигнал SIGPIPE, когда соединение типа SOCK_STREAM неожиданно обрывается. Этот вызов также можно использовать, чтобы задать процесс или группу процессов, которые получают асинхронные уведомления о вводе-выводе с помощью SIGIO. Использование F_SETOWN эквивалентно использованию ioctl(2) с аргументом SIOSETOWN.

Когда сеть сообщает протоколу об ошибке (в случае IP, например, используя ICMP-сообщение), то для сокета устанавливается флаг ожидающей ошибки. Следующая операция с этим сокетом вернет код ожидающей ошибки. Для некоторых протоколов можно разрешить для конкретного сокета очередь ошибок, чтобы получить детальную информацию об ошибке; см. IP_RECVERR в ip(7).

Операции сокетов контролируются их параметрами. Эти параметры описаны в <sys/socket.h>. setsockopt(2) и getsockopt(2) используются, чтобы установить и получить параметры, соответственно.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

В случае ошибки возвращается -1; в противном случае возвращается дескриптор, ссылающийся на сокет.

ОШИБКИ

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

Другие ошибки могут быть сгенерированы нижележащими модулями протоколов.

СООТВЕТСТВИЕ СТАНДАРТАМ

4.4BSD (системный вызов socket появился в 4.2BSD). Обычно переносимо с/на не-BSD системы, имеющие реализацию сокетов BSD (включая варианты System V).

ЗАМЕЧАНИЕ

Для наборов протоколов под BSD 4.* используются константы PF_UNIX, PF_INET и т. д., тогда как AF_UNIX и т. п. используются для указания семьи адресов. Однако же, страница руководства из BSD обещает: "Вообще, набор протоколов совпадает с семьей адресов", и в последующих стандартах везде используется AF_*.

СМОТРИ ТАКЖЕ

accept(2), bind(2), connect(2), getprotoent(3), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2)

“Вводное Руководство по межпроцессной коммуникации в 4.3 BSD” (“An Introductory 4.3 BSD Interprocess Communication Tutorial”) перепечатано в Дополнительные документы для программиста UNIX, Том 1, (UNIX Programmer's Supplementary Documents Volume 1).

“Руководство по межпроцессной коммуникации в BSD” перепечатано в Дополнительные документы для программиста UNIX, Том 1, (UNIX Programmer's Supplementary Documents Volume 1).

ПЕРЕВОД

Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 1999

24 Apr 1999 Руководство по Linux