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