Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       send, sendto, sendmsg - отправляет сообщения в сокет

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <sys/socket.h>

       ssize_t send(int sockfd, const void buf[.len], size_t len, int flags);
       ssize_t sendto(int sockfd, const void buf[.len], size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
       ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

ОПИСАНИЕ

       Системные вызовы send(), sendto() и sendmsg() используются для пересылки сообщений в другой сокет.

       Вызов  send()  можно  использовать,  только если сокет находится в состоянии соединения (то есть известен
       получатель). Вызов send() отличается от write(2) только наличием аргумента  flags.  Если  значение  flags
       равно нулю, то вызов send() эквивалентен write(2). Также, вызов

           send(sockfd, buf, len, flags);

       равнозначно

           sendto(sockfd, buf, len, flags, NULL, 0);

       Аргумент sockfd представляет файловый дескриптор сокета отправления.

       Если  sendto()  используется с сокетом в режиме с установлением соединения (SOCK_STREAM, SOCK_SEQPACKET),
       то аргументы dest_addr и addrlen игнорируются (и может быть возвращена ошибка EISCONN, если  их  значения
       не  равны  NULL  и 0) и возвращается ошибка ENOTCONN, если соединение через сокет не установлено. Иначе в
       dest_addr задаётся адрес назначения и его размер в addrlen. Для sendmsg() адрес назначения указывается  в
       msg.msg_name, а его размер в msg.msg_namelen.

       У  send()  и  sendto()  сообщение находится в buf, а его длина в len. У sendmsg() сообщение указывается в
       элементах массива msg.msg_iov. Вызов sendmsg() также позволяет  отправлять  вспомогательные  данные  (так
       называемую управляющую информацию).

       Если  сообщение  слишком  длинно  для  передачи  за  раз  через  используемый  нижележащий  протокол,  то
       возвращается ошибка EMSGSIZE и сообщение не передаётся.

       Неудачная отправка с помощью send() никак не отмечается. При обнаружении  локальных  ошибок  возвращается
       значение -1.

       Когда  сообщение  не  помещается  в буфер отправки сокета, выполнение блокируется в send(), если сокет не
       находится в неблокирующем режиме. Если сокет находится в неблокирующем режиме,  то   возвращается  ошибка
       EAGAIN или EWOULDBLOCK. Для выяснения, возможна ли отправка данных, можно использовать вызов select(2).

   Аргумент флагов
       Аргумент flags является битовой маской и может содержать следующие флаги:

       MSG_CONFIRM (начиная с Linux 2.3.15)
              Сообщить  уровню  связи,  что  процесс  пересылки  произошел:  вы получили успешный ответ с другой
              стороны. Если уровень связи не получит его, то он будет регулярно перепроверять  наличие  ответной
              стороны  (например  посредством  однонаправленной  передачи  ARP).  Это работает только с сокетами
              SOCK_DGRAM и SOCK_RAW  и  в  настоящее  время  реализовано  только  для  IPv4  и  IPv6.  В  arp(7)
              представлена более подробная информация.

       MSG_DONTROUTE
              Не  использовать  маршрутизацию для отправки пакета, а посылать его только на узлы локальной сети.
              Обычно это используется  в  диагностических  программах  и  программах  маршрутизации.  Этот  флаг
              определён   только  для  маршрутизируемых  семейств  протоколов;  пакетные  сокеты  не  используют
              маршрутизацию.

       MSG_DONTWAIT (начиная с Linux 2.2)
              Enables nonblocking operation; if the operation would block, EAGAIN or  EWOULDBLOCK  is  returned.
              This  provides  similar  behavior  to  setting  the  O_NONBLOCK  flag  (via  the fcntl(2)  F_SETFL
              operation), but differs in that MSG_DONTWAIT is a per-call option, whereas O_NONBLOCK is a setting
              on the open file description (see open(2)), which will affect all threads in the  calling  process
              as well as other processes that hold file descriptors referring to the same open file description.

       MSG_EOR (начиная с Linux 2.2)
              Завершить запись (record) (если поддерживается, например в сокетах типа SOCK_SEQPACKET).

       MSG_MORE (начиная с Linux 2.4.4)
              Вызывающий  имеет  дополнительные  данные  для отправки. Этот флаг используется с сокетами TCP для
              получения такого же эффекта как с параметром сокета TCP_CORK (см. tcp(7)),  с  той  разницей,  что
              этот флаг можно устанавливать при каждом вызове.

              Начиная  с  Linux 2.6 этот флаг также поддерживается для сокетов UDP и информирует ядро, о том что
              нужно упаковать все отправляемые  данные  вызовов  с  этим  флагом  в  одну  дейтаграмму,  которая
              передаётся  только  когда  выполняется  вызов  без  указания  этого флага (смотрите также описание
              параметра сокета UDP_CORK в udp(7)).

       MSG_NOSIGNAL (начиная с Linux 2.2)
              Не генерировать сигнал SIGPIPE, если сторона  потокоориентированного  сокета  закрыла  соединение.
              Ошибка  EPIPE  по  прежнему возвращается. Это создаёт поведение как при использовании sigaction(2)
              для игнорирования SIGPIPE, но MSG_NOSIGNAL  является  свойством  вызова,  а  установка  SIGPIPE  в
              атрибутах процесса влияет на все нити процесса.

       MSG_OOB
              Послать  внепоточные данные, если сокет это поддерживает (как, например, сокеты типа SOCK_STREAM);
              протокол более низкого уровня также должен поддерживать внепоточные данные.

       MSG_FASTOPEN (начиная с Linux 3.7)
              Attempts TCP Fast Open (RFC7413) and sends data in the SYN like a combination of  connect(2)   and
              write(2),  by  performing an implicit connect(2)  operation.  It blocks until the data is buffered
              and the handshake has completed.  For a non-blocking  socket,  it  returns  the  number  of  bytes
              buffered  and  sent  in  the  SYN  packet.   If  the  cookie  is not available locally, it returns
              EINPROGRESS, and sends a SYN with a Fast Open cookie request automatically.  The caller  needs  to
              write  the  data  again  when  the  socket  is  connected.   On  errors, it sets the same errno as
              connect(2)  if the handshake fails.  This flag requires enabling TCP Fast Open client  support  on
              sysctl net.ipv4.tcp_fastopen.

              Refer to TCP_FASTOPEN_CONNECT socket option in tcp(7)  for an alternative approach.

   sendmsg()
       Определение структуры msghdr, используемой sendmsg():

           struct msghdr {
               void         *msg_name;       /* необязательный адрес */
               socklen_t     msg_namelen;    /* размер адреса */
               struct iovec *msg_iov;        /* массив приёма/передачи */
               size_t        msg_iovlen;     /* # количество элементов в msg_iov */
               void         *msg_control;    /* вспомогательные данные,
                                                смотрите ниже */
               size_t        msg_controllen; /* размер буфера вспомогательных
                                                данных */
               int           msg_flags;      /* флаги (не используется) */
           };

       Поле  msg_name  используется  на  неподключённом  сокете  для указания адреса назначения дейтаграммы. Оно
       указывает на буфер с адресом; в поле msg_namelen должен быть  указан  размер  адреса.  Для  подключённого
       сокета значения этих полей должны быть равны NULL и 0, соответственно.

       В полях msg_iov и msg_iovlen задаются места приёма/передачи, как для writev(2).

       You  may send control information (ancillary data) using the msg_control and msg_controllen members.  The
       maximum  control  buffer  length  the  kernel  can  process  is  limited  per  socket  by  the  value  in
       /proc/sys/net/core/optmem_max;  see  socket(7).   For further information on the use of ancillary data in
       various socket domains, see unix(7)  and ip(7).

       Поле msg_flags игнорируется.

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

       On success, these calls return the number of bytes sent.  On error, -1 is returned, and errno is  set  to
       indicate the error.

ОШИБКИ

       Здесь  представлено  несколько  стандартных  ошибок, возвращаемых с уровня сокетов. Могут также появиться
       другие  ошибки,  возвращаемые  из  соответствующих  модулей   протоколов;   их   описание   находится   в
       соответствующих справочных страницах.

       EACCES (для  доменных  сокетов  UNIX,  которые  идентифицируются по имени пути) Нет прав на запись в файл
              сокета назначения или в одном из каталогов пути запрещён поиск (см. также path_resolution(7)).

              (для сокетов UDP) Попытка отправки  по  сетевому/широковещательному  адресу,  как  будто  это  был
              однозначный (unicast) адрес.

       EAGAIN или EWOULDBLOCK
              Сокет  помечен  как  неблокирующий,  но запрошенная операция привела бы к блокировке. POSIX.1-2001
              допускает в этих случаях возврат ошибки  и  не  требует,  чтобы  эти  константы  имели  одинаковое
              значение, поэтому переносимое приложение должно проверять обе возможности.

       EAGAIN (доменные датаграммные сокеты Интернета) Сокет, указанный sockfd, ранее не был привязан к адресу и
              при  попытке  привязать  его  к  эфемеридному  порту,  было определено, что все номера в диапазоне
              эфемеридных портов уже используются. Смотрите обсуждение /proc/sys/net/ipv4/ip_local_port_range  в
              ip(7).

       EALREADY
              Сейчас выполняется другая операция Fast Open.

       EBADF  Значение sockfd не является правильным открытым файловым дескриптором.

       ECONNRESET
              Соединение сброшено другой стороной.

       EDESTADDRREQ
              Сокет в режиме без установления соединения и адрес второй стороны не задан.

       EFAULT В аргументе указано неверное значение адреса пользовательского пространства.

       EINTR  Получен сигнал до начала передачи данных; смотрите signal(7).

       EINVAL Передан неверный аргумент.

       EISCONN
              Сокет  в  режиме с установлением соединения уже выполнил подключение, но указан получатель (теперь
              или возвращается эта ошибка, или игнорируется указание получателя).

       EMSGSIZE
              Для типа сокета требуется, чтобы сообщение было отослано за время  одной  операции  (атомарно),  а
              размер сообщения не позволяет этого.

       ENOBUFS
              Исходящая  очередь  сетевого  интерфейса  заполнена.  Обычно это означает, что интерфейс прекратил
              отправку, но это может быть также вызвано временной перегрузкой сети. Обычно,  в  Linux  этого  не
              происходит. Пакеты просто отбрасываются, когда очередь устройства переполняется.

       ENOMEM Больше нет доступной памяти.

       ENOTCONN
              Сокет не подключён и назначение не задано.

       ENOTSOCK
              Файловый дескриптор sockfd указывает не на каталог.

       EOPNOTSUPP
              Один из битов в аргументе flags не может устанавливаться для этого типа сокета.

       EPIPE  Локальный  сокет,  ориентированный  на соединение, был закрыт. В этом случае процесс также получит
              сигнал SIGPIPE, если не установлен флаг MSG_NOSIGNAL.

ВЕРСИИ

       According to POSIX.1-2001, the msg_controllen field of the msghdr structure should be typed as socklen_t,
       and the msg_iovlen field should be typed as int, but glibc currently types both as size_t.

СТАНДАРТЫ

       POSIX.1-2008.

       MSG_CONFIRM is a Linux extension.

ИСТОРИЯ

       4.4BSD, SVr4, POSIX.1-2001.  (first appeared in 4.2BSD).

       POSIX.1-2001 describes only the  MSG_OOB  and  MSG_EOR  flags.   POSIX.1-2008  adds  a  specification  of
       MSG_NOSIGNAL.

ПРИМЕЧАНИЯ

       В sendmmsg(2) можно найти информацию о специальном системном вызове Linux, который можно использовать для
       передачи нескольких дейтаграмм за один вызов.

ОШИБКИ

       Linux может вернуть EPIPE вместо ENOTCONN.

ПРИМЕРЫ

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

СМОТРИТЕ ТАКЖЕ

       fcntl(2),  getsockopt(2), recv(2), select(2), sendfile(2), sendmmsg(2), shutdown(2), socket(2), write(2),
       cmsg(3), ip(7), ipv6(7), socket(7), tcp(7), udp(7), unix(7)

ПЕРЕВОД

       Русский перевод этой страницы руководства разработал(и)  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> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                   2 мая 2024 г.                                          send(2)