sendto()

Отправить сообщение на сокет по определенному адресу

Прототип:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto( int s,
const void *msg,
size_t len,
int flags,
const struct sockaddr *to,
socklen_t tolen );

Аргументы:

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

Библиотека:

libsocket

Описание:

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

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

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

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

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

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

Коды ошибок:

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

Если семейство адресов сокета - AF_UNIX, sendto() завершается с ошибкой, если:

EIO
Произошла ошибка ввода/вывода при чтении или записи в файловую систему.
ELOOP
Обнаружен цикл в символических ссылках, обнаруженных во время разрешения пути в адресе сокета, или во время разрешения пути в адресе сокета было обнаружено более чем SYMLOOP_MAX символических ссылок.
ENAMETOOLONG
Компонент пути превышает NAME_MAX символов, или полный путь превышает длину в PATH_MAX символов, или разрешение пути символьной ссылки дает промежуточный результат, длина которого превышает PATH_MAX.
ENOENT
Компонент пути не указывает на существующий файл, или путь является пустой строкой.
ENOTDIR
Компонент префикса пути в адресе сокета не является каталогом.

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

POSIX 1003.1

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

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

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




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