Provided by: manpages-ru_0.98-4_all bug

НАЗВАНИЕ

       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@hsys.msk.ru> 2000-2001