Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       socket - создаёт конечную точку соединения

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <sys/socket.h>

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

ОПИСАНИЕ

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

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

       Имя          Цель                                       Справочная страница
       AF_UNIX      Локальное соединение                       unix(7)
       AF_LOCAL     Синоним AF_UNIX
       AF_INET      Протоколы Интернет IPv4                    ip(7)
       AF_AX25      Протокол любительского радио AX.25         ax25(4)
       AF_IPX       Протоколы Novell IPX
       AF_APPLETALK AppleTalk                                  ddp(7)
       AF_X25       Протокол ITU-T X.25/ISO-8208               x25(7)
       AF_INET6     Протоколы Интернет IPv6                    ipv6(7)
       AF_DECnet    Протокольные сокеты DECet
       AF_KEY       Протокол  управления ключами, изначально
                    разрабатывавшийся  для  использования  с
                    IPsec
       AF_NETLINK   Устройство для взаимодействия с ядром      netlink(7)
       AF_PACKET    Низкоуровневый пакетный интерфейс          packet(7)
       AF_RDS       Протокол  надёжных  датаграмных  сокетов   rds(7)
                    (RDS)                                      rds-rdma(7)
       AF_PPPOX     Транспортный слой PPP общего  назначения
                    для настройки туннелей L2 (L2TP и PPPoE)
       AF_LLC       Протокол  управления  логической  связью
                    (IEEE 802.2 LLC)
       AF_IB        Собственная адресация InfiniBand
       AF_MPLS      Многопротокольная коммутация по меткам
       AF_CAN       Протокол    шины    сети    транспортных
                    контроллеров
       AF_TIPC      Протокол  «кластерных  доменных сокетов»
                    TIPC
       AF_BLUETOOTH Сокетный  протокол   Bluetooth   низкого
                    уровня
       AF_ALG       Интерфейс к ядерному крипто-API
       AF_VSOCK     Протокол   VSOCK   (изначально   «VMWare   vsock(7)
                    VSockets») для связей гипервизор-гость
       AF_KCM       KCM  (kernel   connection   multiplexer)
                    interface
       AF_XDP       Интерфейс XDP (express data path)

       Подробнее  об  адресных семействах, приведённых выше, а также информацию о других адресных
       семействах можно найти в address_families(7).

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

       SOCK_STREAM     Обеспечивает  создание  двусторонних,  надёжных  потоков  байтов на основе
                       установления соединения. Может также поддерживаться  механизм  внепоточных
                       данных.

       SOCK_DGRAM      Поддерживает  дейтаграммы  (ненадежные сообщения с ограниченной длиной без
                       установки соединения).

       SOCK_SEQPACKET  Обеспечивает работу последовательного двустороннего  канала  для  передачи
                       дейтаграмм  на  основе соединений; дейтаграммы имеют постоянный размер; от
                       получателя требуется за один раз прочитать целый пакет.

       SOCK_RAW        Обеспечивает прямой доступ к сетевому протоколу.

       SOCK_RDM        Обеспечивает надежную доставку дейтаграмм  без  гарантии,  что  они  будут
                       расположены по порядку.

       SOCK_PACKET     Устарел и не должен использоваться в новых программах; см. packet(7).

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

       Начиная  с  Linux  2.6.27, аргумент type предназначается для двух вещей: кроме определения
       типа сокета, для изменения поведения socket() он может содержать побитно  сложенные  любые
       следующие значения:

       SOCK_NONBLOCK   Устанавливает   флаг  состояния  файла  O_NONBLOCK  для  нового  открытого
                       файлового описания (смотрите open(2)), на которое ссылается новый файловый
                       дескриптор.  Использование  данного  флага делает ненужными дополнительные
                       вызовы fcntl(2) для достижения того же результата.

       SOCK_CLOEXEC    Устанавливает  флаг  close-on-exec  (FD_CLOEXEC)  для   нового   открытого
                       файлового  дескриптора.  Смотрите  описание  флага O_CLOEXEC в open(2) для
                       того, чтобы узнать как это может пригодиться.

       В  protocol  задаётся  определённый  протокол,  используемый  с  сокетом.  Обычно,  только
       единственный  протокол  существует  для  поддержи  определённого  типа  сокета  с заданным
       семейством  протоколов,  в  этом  случае  в  protocol  можно  указать  0.  Однако,   может
       существовать  несколько  протоколов,  тогда нужно указать один из них. Номер используемого
       протокола зависит от "домена соединения”,  по  которому  устанавливается  соединение;  см.
       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 позволяют посылать дейтаграммы принимающей стороне, заданной
       при вызове sendto(2). Дейтаграммы обычно принимаются с помощью вызова recvfrom(2), который
       возвращает следующую дейтаграмму с соответствующим обратным адресом.

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

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

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

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

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

       On  success,  a file descriptor for the new socket is returned.  On error, -1 is returned,
       and errno is set to indicate the error.

ОШИБКИ

       EACCES Нет прав на создание сокета указанного типа и/или протокола.

       EAFNOSUPPORT
              Реализация не поддерживает указанное семейства адресов.

       EINVAL Неизвестный протокол или недоступное семейство протоколов.

       EINVAL Неверные флаги в type.

       EMFILE Было  достигнуто  ограничение  по  количеству  открытых  файловых  дескрипторов  на
              процесс.

       ENFILE Достигнуто максимальное количество открытых файлов в системе.

       ENOBUFS или ENOMEM
              Недостаточно  памяти для создания сокета. Сокет не может быть создан, пока не будет
              освобождено достаточное количество ресурсов.

       EPROTONOSUPPORT
              Тип протокола или указанный протокол не поддерживаются в этом домене.

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

СТАНДАРТЫ

       POSIX.1-2001, POSIX.1-2008, 4.4BSD.

       Флаги SOCK_NONBLOCK и SOCK_CLOEXEC есть только в Linux.

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

ЗАМЕЧАНИЯ

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

ПРИМЕРЫ

       Пример использования socket() показан в getaddrinfo(3).

СМ. ТАКЖЕ

       accept(2),  bind(2),  close(2),  connect(2),  fcntl(2),  getpeername(2),   getsockname(2),
       getsockopt(2),  ioctl(2),  listen(2),  read(2),  recv(2), select(2), send(2), shutdown(2),
       socketpair(2), write(2), getprotoent(3), address_families(7),  ip(7),  socket(7),  tcp(7),
       udp(7), unix(7)

       “An  Introductory  4.3BSD  Interprocess  Communication  Tutorial”  and  “BSD  Interprocess
       Communication Tutorial”, reprinted in UNIX Programmer's Supplementary Documents Volume 1.

ПЕРЕВОД

       Русский   перевод   этой   страницы   руководства    был    сделан    Alexander    Golubev
       <fatzer2@gmail.com>,   Azamat   Hackimov  <azamat.hackimov@gmail.com>,  Hotellook,  Nikita
       <zxcvbnm3230@mail.ru>,       Spiros       Georgaras       <sng@hellug.gr>,       Vladislav
       <ivladislavefimov@gmail.com>,    Yuri    Kozlov   <yuray@komyakino.ru>   и   Иван   Павлов
       <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.