.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1983, 1991 The Regents of the University of California. .\" All rights reserved. .\" .\" SPDX-License-Identifier: BSD-4-Clause-UC .\" .\" Modified 1993-07-24 by Rik Faith .\" Modified 1996-10-22 by Eric S. Raymond .\" Modified Oct 1998 by Andi Kleen .\" Modified Oct 2003 by aeb .\" Modified 2004-07-01 by mtk .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH send 2 "31 октября 2023 г." "Linux man\-pages 6.06" .SH ИМЯ send, sendto, sendmsg \- отправляет сообщения в сокет .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .P \fBssize_t send(int \fP\fIsockfd\fP\fB, const void \fP\fIbuf\fP\fB[.\fP\fIlen\fP\fB], size_t \fP\fIlen\fP\fB, int \fP\fIflags\fP\fB);\fP \fBssize_t sendto(int \fP\fIsockfd\fP\fB, const void \fP\fIbuf\fP\fB[.\fP\fIlen\fP\fB], size_t \fP\fIlen\fP\fB, int \fP\fIflags\fP\fB,\fP \fB const struct sockaddr *\fP\fIdest_addr\fP\fB, socklen_t \fP\fIaddrlen\fP\fB);\fP \fBssize_t sendmsg(int \fP\fIsockfd\fP\fB, const struct msghdr *\fP\fImsg\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .SH ОПИСАНИЕ Системные вызовы \fBsend\fP(), \fBsendto\fP() и \fBsendmsg\fP() используются для пересылки сообщений в другой сокет. .P Вызов \fBsend\fP() можно использовать, только если сокет находится в состоянии \fIсоединения\fP (то есть известен получатель). Вызов \fBsend\fP() отличается от \fBwrite\fP(2) только наличием аргумента \fIflags\fP. Если значение \fIflags\fP равно нулю, то вызов \fBsend\fP() эквивалентен \fBwrite\fP(2). Также, вызов .P .in +4n .EX send(sockfd, buf, len, flags); .EE .in .P эквивалентен .P .in +4n .EX sendto(sockfd, buf, len, flags, NULL, 0); .EE .in .P Аргумент \fIsockfd\fP представляет файловый дескриптор сокета отправления. .P Если \fBsendto\fP() используется с сокетом в режиме с установлением соединения (\fBSOCK_STREAM\fP, \fBSOCK_SEQPACKET\fP), то аргументы \fIdest_addr\fP и \fIaddrlen\fP игнорируются (и может быть возвращена ошибка \fBEISCONN\fP, если их значения не равны NULL и 0) и возвращается ошибка \fBENOTCONN\fP, если соединение через сокет не установлено. Иначе в \fIdest_addr\fP задаётся адрес назначения и его размер в \fIaddrlen\fP. Для \fBsendmsg\fP() адрес назначения указывается в \fImsg.msg_name\fP, а его размер в \fImsg.msg_namelen\fP. .P У \fBsend\fP() и \fBsendto\fP() сообщение находится в \fIbuf\fP, а его длина в \fIlen\fP. У \fBsendmsg\fP() сообщение указывается в элементах массива \fImsg.msg_iov\fP. Вызов \fBsendmsg\fP() также позволяет отправлять вспомогательные данные (так называемую управляющую информацию). .P Если сообщение слишком длинно для передачи за раз через используемый нижележащий протокол, то возвращается ошибка \fBEMSGSIZE\fP и сообщение не передаётся. .P Неудачная отправка с помощью \fBsend\fP() никак не отмечается. При обнаружении локальных ошибок возвращается значение \-1. .P Когда сообщение не помещается в буфер отправки сокета, выполнение блокируется в \fBsend\fP(), если сокет не находится в неблокирующем режиме. Если сокет находится в неблокирующем режиме, то возвращается ошибка \fBEAGAIN\fP или \fBEWOULDBLOCK\fP. Для выяснения, возможна ли отправка данных, можно использовать вызов \fBselect\fP(2). .SS "Аргумент флагов" .\" FIXME . ? document MSG_PROXY (which went away in Linux 2.3.15) Аргумент \fIflags\fP является битовой маской и может содержать следующие флаги: .TP \fBMSG_CONFIRM\fP (начиная с Linux 2.3.15) Сообщить уровню связи, что процесс пересылки произошел: вы получили успешный ответ с другой стороны. Если уровень связи не получит его, то он будет регулярно перепроверять наличие ответной стороны (например посредством однонаправленной передачи ARP). Это работает только с сокетами \fBSOCK_DGRAM\fP и \fBSOCK_RAW\fP и в настоящее время реализовано только для IPv4 и IPv6. В \fBarp\fP(7) представлена более подробная информация. .TP \fBMSG_DONTROUTE\fP Не использовать маршрутизацию для отправки пакета, а посылать его только на узлы локальной сети. Обычно это используется в диагностических программах и программах маршрутизации. Этот флаг определён только для маршрутизируемых семейств протоколов; пакетные сокеты не используют маршрутизацию. .TP \fBMSG_DONTWAIT\fP (начиная с Linux 2.2) Включить неблокирующий режим. Если операция могла бы привести к блокировке, возвращается \fBEAGAIN\fP или \fBEWOULDBLOCK\fP. Такое поведение подобно заданию флага \fBO_NONBLOCK\fP (в \fBfcntl\fP(2) операцией \fBF_SETFL\fP), но отличие в том, что \fBMSG_DONTWAIT\fP указывается в вызове, а \fBO_NONBLOCK\fP задаётся в описании открытого файла (смотрите \fBopen\fP(2)), что влияет на все нити вызывающего процесса, а также на другие процессы, у которых есть файловые дескрипторы, ссылающиеся на это описание открытого файла. .TP \fBMSG_EOR\fP (начиная с Linux 2.2) Завершить запись (record) (если поддерживается, например в сокетах типа \fBSOCK_SEQPACKET\fP). .TP \fBMSG_MORE\fP (начиная с Linux 2.4.4) Вызывающий имеет дополнительные данные для отправки. Этот флаг используется с сокетами TCP для получения такого же эффекта как с параметром сокета \fBTCP_CORK\fP (см. \fBtcp\fP(7)), с той разницей, что этот флаг можно устанавливать при каждом вызове. .IP Начиная с Linux 2.6 этот флаг также поддерживается для сокетов UDP и информирует ядро, о том что нужно упаковать все отправляемые данные вызовов с этим флагом в одну дейтаграмму, которая передаётся только когда выполняется вызов без указания этого флага (смотрите также описание параметра сокета \fBUDP_CORK\fP в \fBudp\fP(7)). .TP \fBMSG_NOSIGNAL\fP (начиная с Linux 2.2) Не генерировать сигнал \fBSIGPIPE\fP, если сторона потокоориентированного сокета закрыла соединение. Ошибка \fBEPIPE\fP по прежнему возвращается. Это создаёт поведение как при использовании \fBsigaction\fP(2) для игнорирования \fBSIGPIPE\fP, но \fBMSG_NOSIGNAL\fP является свойством вызова, а установка \fBSIGPIPE\fP в атрибутах процесса влияет на все нити процесса. .TP \fBMSG_OOB\fP Послать \fIвнепоточные данные\fP, если сокет это поддерживает (как, например, сокеты типа \fBSOCK_STREAM\fP); протокол более низкого уровня также должен поддерживать \fIвнепоточные данные\fP. .TP \fBMSG_FASTOPEN\fP (начиная с Linux 3.7) Attempts TCP Fast Open (RFC7413) and sends data in the SYN like a combination of \fBconnect\fP(2) and \fBwrite\fP(2), by performing an implicit \fBconnect\fP(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 \fBEINPROGRESS\fP, 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 \fIerrno\fP as \fBconnect\fP(2) if the handshake fails. This flag requires enabling TCP Fast Open client support on sysctl \fInet.ipv4.tcp_fastopen\fP. .IP Refer to \fBTCP_FASTOPEN_CONNECT\fP socket option in \fBtcp\fP(7) for an alternative approach. .SS sendmsg() Определение структуры \fImsghdr\fP, используемой \fBsendmsg\fP(): .P .in +4n .EX 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; /* флаги (не используется) */ }; .EE .in .P Поле \fImsg_name\fP используется на неподключённом сокете для указания адреса назначения дейтаграммы. Оно указывает на буфер с адресом; в поле \fImsg_namelen\fP должен быть указан размер адреса. Для подключённого сокета значения этих полей должны быть равны NULL и 0, соответственно. .P В полях \fImsg_iov\fP и \fImsg_iovlen\fP задаются места приёма/передачи, как для \fBwritev\fP(2). .P You may send control information (ancillary data) using the \fImsg_control\fP and \fImsg_controllen\fP members. The maximum control buffer length the kernel can process is limited per socket by the value in \fI/proc/sys/net/core/optmem_max\fP; see \fBsocket\fP(7). For further information on the use of ancillary data in various socket domains, see \fBunix\fP(7) and \fBip\fP(7). .P .\" Still to be documented: .\" Send file descriptors and user credentials using the .\" msg_control* fields. Поле \fImsg_flags\fP игнорируется. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" On success, these calls return the number of bytes sent. On error, \-1 is returned, and \fIerrno\fP is set to indicate the error. .SH ОШИБКИ Здесь представлено несколько стандартных ошибок, возвращаемых с уровня сокетов. Могут также появиться другие ошибки, возвращаемые из соответствующих модулей протоколов; их описание находится в соответствующих справочных страницах. .TP \fBEACCES\fP (для доменных сокетов UNIX, которые идентифицируются по имени пути) Нет прав на запись в файл сокета назначения или в одном из каталогов пути запрещён поиск (см. также \fBpath_resolution\fP(7)). .IP (для сокетов UDP) Попытка отправки по сетевому/широковещательному адресу, как будто это был однозначный (unicast) адрес. .TP \fBEAGAIN\fP или \fBEWOULDBLOCK\fP .\" Actually EAGAIN on Linux Сокет помечен как неблокирующий, но запрошенная операция привела бы к блокировке. POSIX.1\-2001 допускает в этих случаях возврат ошибки и не требует, чтобы эти константы имели одинаковое значение, поэтому переносимое приложение должно проверять обе возможности. .TP \fBEAGAIN\fP (доменные датаграммные сокеты Интернета) Сокет, указанный \fIsockfd\fP, ранее не был привязан к адресу и при попытке привязать его к эфемеридному порту, было определено, что все номера в диапазоне эфемеридных портов уже используются. Смотрите обсуждение \fI/proc/sys/net/ipv4/ip_local_port_range\fP в \fBip\fP(7). .TP \fBEALREADY\fP Сейчас выполняется другая операция Fast Open. .TP \fBEBADF\fP Значение \fIsockfd\fP не является правильным открытым файловым дескриптором. .TP \fBECONNRESET\fP Соединение сброшено другой стороной. .TP \fBEDESTADDRREQ\fP Сокет в режиме без установления соединения и адрес второй стороны не задан. .TP \fBEFAULT\fP В аргументе указано неверное значение адреса пользовательского пространства. .TP \fBEINTR\fP Получен сигнал до начала передачи данных; смотрите \fBsignal\fP(7). .TP \fBEINVAL\fP Передан неверный аргумент. .TP \fBEISCONN\fP Сокет в режиме с установлением соединения уже выполнил подключение, но указан получатель (теперь или возвращается эта ошибка, или игнорируется указание получателя). .TP \fBEMSGSIZE\fP .\" (e.g., SOCK_DGRAM ) Для типа сокета требуется, чтобы сообщение было отослано за время одной операции (атомарно), а размер сообщения не позволяет этого. .TP \fBENOBUFS\fP Исходящая очередь сетевого интерфейса заполнена. Обычно это означает, что интерфейс прекратил отправку, но это может быть также вызвано временной перегрузкой сети. Обычно, в Linux этого не происходит. Пакеты просто отбрасываются, когда очередь устройства переполняется. .TP \fBENOMEM\fP Больше нет доступной памяти. .TP \fBENOTCONN\fP Сокет не подключён и назначение не задано. .TP \fBENOTSOCK\fP Файловый дескриптор \fIsockfd\fP указывает не на каталог. .TP \fBEOPNOTSUPP\fP Один из битов в аргументе \fIflags\fP не может устанавливаться для этого типа сокета. .TP \fBEPIPE\fP Локальный сокет, ориентированный на соединение, был закрыт. В этом случае процесс также получит сигнал \fBSIGPIPE\fP, если не установлен флаг \fBMSG_NOSIGNAL\fP. .SH ВЕРСИИ .\" glibc bug for msg_controllen raised 12 Mar 2006 .\" http://sourceware.org/bugzilla/show_bug.cgi?id=2448 .\" The problem is an underlying kernel issue: the size of the .\" __kernel_size_t type used to type these fields varies .\" across architectures, but socklen_t is always 32 bits, .\" as (at least with GCC) is int. According to POSIX.1\-2001, the \fImsg_controllen\fP field of the \fImsghdr\fP structure should be typed as \fIsocklen_t\fP, and the \fImsg_iovlen\fP field should be typed as \fIint\fP, but glibc currently types both as \fIsize_t\fP. .SH СТАНДАРТЫ POSIX.1\-2008. .P \fBMSG_CONFIRM\fP is a Linux extension. .SH ИСТОРИЯ 4.4BSD, SVr4, POSIX.1\-2001. (first appeared in 4.2BSD). .P POSIX.1\-2001 describes only the \fBMSG_OOB\fP and \fBMSG_EOR\fP flags. POSIX.1\-2008 adds a specification of \fBMSG_NOSIGNAL\fP. .SH ЗАМЕЧАНИЯ В \fBsendmmsg\fP(2) можно найти информацию о специальном системном вызове Linux, который можно использовать для передачи нескольких дейтаграмм за один вызов. .SH ДЕФЕКТЫ Linux может вернуть \fBEPIPE\fP вместо \fBENOTCONN\fP. .SH ПРИМЕРЫ Пример использования \fBsendto\fP() показан в \fBgetaddrinfo\fP(3). .SH "СМ. ТАКЖЕ" \fBfcntl\fP(2), \fBgetsockopt\fP(2), \fBrecv\fP(2), \fBselect\fP(2), \fBsendfile\fP(2), \fBsendmmsg\fP(2), \fBshutdown\fP(2), \fBsocket\fP(2), \fBwrite\fP(2), \fBcmsg\fP(3), \fBip\fP(7), \fBipv6\fP(7), \fBsocket\fP(7), \fBtcp\fP(7), \fBudp\fP(7), \fBunix\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .