НАЗВАНИЕ
send, sendto, sendmsg − отправить сообщение в сокет
КРАТКАЯ СВОДКА
#include
<sys/types.h>
#include <sys/socket.h>
int
send(int s, const void *msg,
size_t len, int flags);
int sendto(int s, const void
*msg, size_t len, int
flags, const struct sockaddr *to,
socklen_t tolen);
int sendmsg(int s, const struct msghdr
*msg, int flags);
ОПИСАНИЕ
send, sendto, и sendmsg используются для пересылки сообщений на другой сокет. send можно использовать, только если сокет находится в соединенном состоянии, тогда как sendto и sendmsg можно использовать в любое время.
Адрес получателя задается в параметре to длины tolen. Длина сообщения задается в параметре len. Если сообщение слишком длинное, чтобы нижележащий протокол смог атомарно отослать его, возвращается код ошибки EMSGSIZE, а сообщение не отсылается.
No indication of failure to deliver is implicit in a send. Локальные ошибки обозначаются с помощью возвращаемого значения −1.
Когда сообщение не помещается в буфер отправки сокета, send обычно дожидается завершения отправки, если только сокет не находится в неблокирующем режиме. Если так, то возвращается EAGAIN. Системный вызов select(2) можно использовать для выяснения возможности отправки данных.
Параметр
flags
является
битовой
маской и
может
содержать
такие
флаги:
MSG_OOB
Посылает внепотоковые данные, если сокет поддерживает такое (например, сокеты типа SOCK_STREAM); нижележащий протокол также должен поддерживать внепотоковые данные.
MSG_DONTROUTE
Не использовать маршрутизацию при отправке пакета, а посылать его только на хосты в локальной сети. Обычно это используется в диагностических программах и программах маршрутизации. Этот флаг определен только для маршрутизируемых семейств протоколов; пакетные сокеты не используют маршрутизацию.
MSG_DONTWAIT
Включает неблокирующий режим; если бы операция должна была заблокировать программу, возвращается EAGAIN (этот режим также можно включить с помощью опции O_NONBLOCK и команды F_SETFL в функции fcntl(2)).
MSG_NOSIGNAL
Требует не посылать сигнал SIGPIPE когда при работе с потоко-ориентированным сокетом другая сторона обрывает соединение. Код ошибки EPIPE возвращается в любом случае.
MSG_CONFIRM(только Linux 2.3 и выше)
Сообщить уровню соединения, что вы успешно получили ответ от другой стороны. Уровень соединения регулярно пытается обратиться к соседу (например, с помощью unicast ARP), до тех пор пока не получит такое сообщение. Эту возможность можно использовать только на сокетах типа SOCK_DGRAM и SOCK_RAW. В настоящий момент эта возможность реализована только для IPv4 и IPv6. См. arp(7), где описаны детали.
Определение структуры msghdr изложено ниже. См. ниже, а также в recv(2), где описано каждое поле.
struct msghdr {
void * msg_name; /*
необязательный
адрес */
socklen_t msg_namelen; /*
размер
адреса */
struct iovec * msg_iov; /*
массив scatter/gather */
size_t msg_iovlen; /* #
элементы
в msg_iov */
void * msg_control; /*
служебные
данные, см.
ниже */
socklen_t msg_controllen; /*
размер
буфера
служебных
данных */
int msg_flags; /* флаги
на
принятом
сообщении
*/
};
Управляющую информацию можно посылать с помощью членов msg_control и msg_controllen. Максимальная длина управляющего буфера, которую поддерживает ядро, ограничена sysctl-значением net.core.optmem_max; см. socket(7).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Эти системные вызовы возвращают количество отправленных символов или −1, если произошла ошибка.
ОШИБКИ
Есть несколько стандартных ошибок, генерируемых на уровне сокетов. Нижележащие модули протоколов могут также возвращать дополнительные коды ошибок; смотри соответствующие страницы руководства.
EBADF |
Указан неверный дескриптор. |
ENOTSOCK
Аргумент s не является сокетом.
EFAULT |
В качестве параметра передан неверный адрес. |
EMSGSIZE
Сокет требует, чтобы сообщение было отослано за одну операцию (атомарно), а размер сообщения не позволяет этого.
EAGAIN или EWOULDBLOCK
Сокет помечен как неблокирующий, а запрошенная операция должна была бы заблокировать его.
ENOBUFS |
Исходящая очередь сетевого интерфейса заполнена. Обычно это означает, что интерфейс прекратил отправку, но может быть также вызвано временной перегрузкой. (Этого не может произойти под Linux, потому что здесь пакеты просто отбрасываются, когда очередь устройства переполняется.) | ||
EINTR |
Появился сигнал. | ||
ENOMEM |
Не хватило памяти. | ||
EINVAL |
Передан неверный аргумент. | ||
EPIPE |
Локальный конец сокета, ориентированного на соединение, был закрыт. В этом случае процесс также получит сигнал SIGPIPE, если только не установлен флаг MSG_NOSIGNAL. |
СООТВЕТСТВИЕ СТАНДАРТАМ
4.4BSD, SVr4, POSIX 1003.1g draft (эти системные вызовы появились в 4.2BSD).
MSG_CONFIRM является Linux-специфичным расширением.
ЗАМЕЧАНИЕ
Вышеприведенные прототипы соответствуют glibc2. Стандарт SUS согласен с ними, за исключением того, что там возвращаемые значения определены как ssize_t (тогда как в BSD 4.x, libc4 и libc5 они определены как int). Аргумент flags является int в BSD 4.x, но unsigned int в libc4 и libc5. Аргумент len является int в BSD 4.x, но size_t в libc4 и libc5. Аргумент fromlen является int * в BSD 4.x, libc4 и libc5. Текущее определение, socklen_t, было изобретено в POSIX (см. также accept(2)).
СМОТРИ ТАКЖЕ
fcntl(2), recv(2), select(2), getsockopt(2), sendfile(2), socket(2), write(2), socket(7), ip(7), tcp(7), udp(7)
ПЕРЕВОД
Copyright (C) Alexey Mahotkin <alexm [AT] hsys.ru> 2000-2001