sendmsg()

Отправить сообщение и его заголовок на сокет

Прототип:

#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 сетевой библиотеки