Документация по LinuxLinuxDoc.Ru 🔍

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

НАЗВАНИЕ
send, sendto, sendmsg - отправляет сообщения в сокет

СИНТАКСИС
#include
#include

int send(int s, const void *msg, size_t len, int flags);
int sendto(int s, const void *msg, size_t len, int flags,
const struct sockaddr *to, socklen_t tolen);
int sendmsg(int s, const struct msghdr *msg, int flags);

ОПИСАНИЕ
send, sendto, и sendmsg используются для пересылки
сообщений в другой сокет. send можно использовать, только
если сокет находится в состоянии соединения, тогда как
sendto и sendmsg можно использовать в любое время.

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

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

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

Параметр flags является битовой маской и может содержать
такие флаги:

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

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

MSG_DONTWAIT
Включает режим non-blocking; если операция должна
была заблокировать программу, возвращается EAGAIN
(этот режим также можно задать с помощью опции
O_NONBLOCK, команды F_SETFL и функции fcntl(2)).

MSG_NOSIGNAL
Требует не посылать сигнал SIGPIPE, если при работе
с ориентированным на поток сокетом другая сторона
обрывает соединение. Код ошибки EPIPE возвращается
в любом случае.

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

Определение структуры msghdr описано в recv(2) и ниже с
описаниями полей.

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

Управляющую информацию можно посылать с помощью
компонентов msg_control и msg_controllen. Максимальная
длина управляющего буфера, которую поддерживает ядро,
ограничена значением net.core.optmem_max; см. socket(7).

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

Эти системные вызовы возвращают количество отправленных
символов или -1, если произошла ошибка.

КОДЫ ОШИБОК

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

EBADF Указан неверный описатель.

ENOTSOCK
Аргумент s не является сокетом.

EFAULT В качестве параметра передан неверный адрес.

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

EAGAIN или EWOULDBLOCK
Сокет помечен как non-blocking, а запрошенная
операция должна была заблокировать его.

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

EINTR Поступил соответствующий сигнал.

ENOMEM Недостаточно памяти в системе.

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

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

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

4.4BSD, SVr4, POSIX 1003.1g draft (эти системные вызовы
появились в 4.2BSD). MSG_CONFIRM является расширением для
Linux.

ЗАМЕЧАНИЕ

Вышеприведенные прототипы соответствуют прототипам glibc2.
Single Unix Specification согласен с ними, за исключением
того, что в этом стандарте возвращаемые значения
определены как ssize_t (тогда как в BSD 4.x, libc4 и libc5
они определены как int). Аргумент flags является int в
BSD 4.x, но unsigned int в libc4 и libc5. Аргумент len
является int в BSD 4.x, но size_t в libc4 и libc5.
Аргумент fromlen является int * в BSD 4.x, libc4 и libc5.
См. также accept(2).
Читать новости Linux в Telegram
Linux - send, sendto, sendmsg - отправляет сообщения в сокет
Мы в соцсетях ✉