send()

Отправить сообщение на подключенный сокет

Прототип:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t send( int s,
const void *msg,
size_t len,
int flags );

Аргументы:

s
Дескриптор сокета; см. socket().
msg
Указатель на сообщение, которое требуется отправить.
len
Длина сообщения.
flags
Комбинация из следующих флагов:
MSG_OOB
обрабатывать внеполосные данные. Следует использовать этот бит, при отправке «внеполосных» данных в сокеты, которые их поддерживают (например, SOCK_STREAM). Базовый протокол также должен поддерживать внеполосные данные.
MSG_DONTROUTE
обходная маршрутизация; создать прямой интерфейс. Обычно этот бит используется только в программах диагностики или маршрутизации.
MSG_NOSIGNAL
не генерировать сигнал SIGPIPE при разрыве соединения с другого конца.

Библиотека:

libsocket

Описание:

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

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

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

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

Возвращаемое значение:

Число отправленных байт данных. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EACCES
У вызывающего процесса нет соответствующих привилегий.
EAGAIN
Дескриптор файла сокета помечен как O_NONBLOCK, и запрошенная операция будет заблокирована.
EBADF
Указан некорректный дескриптор.
ECONNRESET
Соединение было принудительно закрыто пиром.
EDESTADDRREQ
Сокет не находится в режиме соединения, и адрес пира не установлен.
EFAULT
В качестве параметра указан недопустимый адрес пользовательского пространства.
EINTR
Сигнал прервал работу функции send() до того, как были переданы какие-либо данные.
EIO
Произошла ошибка ввода/вывода при чтении или записи в файловую систему.
EMSGSIZE
Сокет требует, чтобы сообщение было отправлено атомарно, но это невозможно ввиду размера сообщения.
ENETDOWN
Интерфейс локальной сети, используемый для достижения пункта назначения, не отвечает.
ENETUNREACH
Нет маршрута к сети.
ENOBUFS
Системе не удалось выделить внутренний буфер. Операция может завершиться успешно, когда буферы станут доступны.
ENOTCONN
Сокет не подключен или в нем заранее не указан пир.
ENOTSOCK
Аргумент не является сокетом.
EOPNOTSUPP
Аргумент сокета связан с сокетом, который не поддерживает одно или несколько значений, установленных в flags.
EPIPE
Сокет отключен для записи или сокет находится в режиме подключения и больше не подключен. В последнем случае, и если сокет имеет тип SOCK_STREAM, для вызывающего потока генерируется сигнал SIGPIPE.
EWOULDBLOCK
Сокет помечен как неблокирующий, и запрошенная операция будет заблокирована.

Классификация:

POSIX 1003.1

Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

getsockopt(), ioctl(), recv(), select(), sendmsg(), sendto(), socket(), write()




Предыдущий раздел: Описание API сетевой библиотеки