Отправить сообщение и его заголовок на сокет
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendmsg( int s,
const struct msghdr *msg,
int flags );
- s
- Дескриптор сокета; см. socket().
- msg
- Указатель на сообщение, которое требуется отправить. Для получения информации по структуре msghdr, см. recvmsg().
- flags
- Комбинация из следующих флагов:
- MSG_OOB
- обрабатывать внеполосные данные. Следует использовать этот бит, при отправке «внеполосных» данных в сокеты, которые их поддерживают (например,
SOCK_STREAM
). Базовый протокол также должен поддерживать внеполосные данные. - MSG_DONTROUTE
- обходная маршрутизация; создать прямой интерфейс. Обычно этот бит используется только в программах диагностики или маршрутизации.
- MSG_NOSIGNAL
- не генерировать сигнал
SIGPIPE
при разрыве соединения с другого конца.
libsocket
Функция sendmsg() используются для передачи сообщения на другой сокет. Использование send() возможно только если сокет находится в состоянии соединения; использование sendmsg() допустимо в любой момент.
В sendmsg() нет никаких указаний на случай, если произойдет сбой доставки. Локально обнаруженные ошибки обозначаются возвращаемым значением -1
.
Если в сокете недостаточно памяти для передаваемого сообщения, то sendmsg() обычно блокируется, если только сокет не был переведен в неблокирующий режим ввода/вывода. Можно использовать select(), чтобы определить, когда можно отправить больше данных.
Число отправленных байт данных. Если возникла ошибка функция возвращает -1
, код ошибки записывается в errno.
- EACCES
- Для компонента префикса пути отказано в разрешении на поиск или отказано в доступе на запись к названному сокету.
- EAGAIN
- Дескриптор файла сокета помечен как
O_NONBLOCK
, и запрошенная операция будет заблокирована. - EAFNOSUPPORT
- Адреса из указанного семейства адресов не могут использоваться с этим сокетом.
- EBADF
- Указан некорректный дескриптор.
- ECONNRESET
- Соединение было принудительно закрыто пиром.
- EDESTADDRREQ
- Сокет не находится в режиме соединения, и адрес пира не установлен, а также не указан адрес назначения.
- EFAULT
- В качестве параметра указан недопустимый адрес пользовательского пространства.
- EHOSTUNREACH
- Целевой хост недоступен (возможно, из-за того, что хост не работает или удаленный маршрутизатор не может связаться с ним).
- EINTR
- Сигнал прервал работу функции sendmsg() до того, как были переданы какие-либо данные.
- EINVAL
- Сумма значений
iov_len
переполняет ssize_t
. - EIO
- Произошла ошибка ввода/вывода при чтении или записи в файловую систему.
- EISCONN
- Указан адрес назначения, и сокет уже подключен.
- EMSGSIZE
- Сообщение слишком велико для отправки сразу (как того требует сокет), или член msg_iovlen структуры msghdr, на которую указывает message, меньше или равен
0
или больше, чем IOV_MAX
. - ENETDOWN
- Интерфейс локальной сети, используемый для достижения пункта назначения, не отвечает.
- ENETUNREACH
- Нет маршрута к сети.
- ENOBUFS
- Системе не удалось выделить внутренний буфер. Операция может завершиться успешно, когда буферы станут доступны.
- ENOMEM
- Недостаточно памяти для выполнения запроса.
- ENOTCONN
- Сокет не подключен или в нем заранее не указан пир.
- ENOTSOCK
- Аргумент не является сокетом.
- EOPNOTSUPP
- Аргумент сокета связан с сокетом, который не поддерживает одно или несколько значений, установленных в flags.
- EPIPE
- Сокет отключен для записи или сокет находится в режиме подключения и больше не подключен. В последнем случае, и если сокет имеет тип
SOCK_STREAM
, для вызывающего потока генерируется сигнал SIGPIPE
. - EWOULDBLOCK
- Сокет помечен как неблокирующий, и запрошенная операция будет заблокирована.
Если семейство адресов сокета - AF_UNIX
, sendmsg() завершается с ошибкой, если:
- EIO
- Произошла ошибка ввода/вывода при чтении или записи в файловую систему.
- ELOOP
- Обнаружен цикл в символических ссылках, обнаруженных во время разрешения пути в адресе сокета, или во время разрешения пути в адресе сокета было обнаружено более чем
SYMLOOP_MAX
символических ссылок. - ENAMETOOLONG
- Компонент пути превышает
NAME_MAX
символов, или полный путь превышает длину в PATH_MAX
символов, или разрешение пути символьной ссылки дает промежуточный результат, длина которого превышает PATH_MAX
. - ENOENT
- Компонент пути не указывает на существующий файл, или путь является пустой строкой.
- ENOTDIR
- Компонент префикса пути в адресе сокета не является каталогом.
POSIX 1003.1
- Да
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Нет
- В потоке
- Да
getsockopt(), ioctl(), recv(), select(), send(), sendto(), socket(), write()
Предыдущий раздел: Описание API сетевой библиотеки