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, задающий семантику коммуникации. В настоящее время определены следующие типы:
SOCK_STREAM
Обеспечивает надежные, двунаправленные последовательные потоки байтов, с поддержкой соединений. Может также поддерживаться механизм вне-поточных данных.
SOCK_DGRAM
Обеспечивает датаграммы (ненадежные сообщения с ограниченной максимальной длиной, без поддержки соединения).
SOCK_SEQPACKET
Обеспечивает последовательный двунаправленный канал передачи датаграмм с поддержкой соединений; датаграммы имеют ограниченную максимальную длину; от получателя требуется за один раз прочитать целый пакет.
SOCK_RAW
Обеспечивает доступ к низкоуровневому сетевому протоколу.
SOCK_RDM
Обеспечивает надежную доставку датаграмм без гарантии их последовательности.
SOCK_PACKET
Устарело и не должно использоваться в новых программах; см. 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; в противном случае возвращается дескриптор, ссылающийся на сокет.

ОШИБКИ

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

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

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