Отправить сообщение на подключенный сокет
#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 сетевой библиотеки