recv

RECV(2)         Ð ÑководÑÑво пÑогÑаммиÑÑа Linux         RECV(2)



ÐÐЯ
       recv, recvfrom, recvmsg - пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑообÑение из
       ÑокеÑа

ÐÐÐÐÐ
       #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t recv(int sockfd, void *buf, size_t len, int flags);

       ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

       ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

ÐÐÐСÐÐÐÐ
       СиÑÑемнÑе вÑÐ·Ð¾Ð²Ñ recv(), recvfrom() и recvmsg()
       иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑообÑений из
       ÑокеÑа. Ðни могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑениÑ
       даннÑÑ, незавиÑимо Ð¾Ñ Ñого, ÑвлÑеÑÑÑ Ð»Ð¸ ÑокеÑ
       оÑиенÑиÑованнÑм на ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ неÑ. Ð
       ÑÑой ÑÑÑаниÑе ÑпеÑва опиÑÐ°Ð½Ñ Ð¾Ð±Ñие ÑвойÑÑва
       вÑÐµÑ ÑÑÑÑ ÑиÑÑемнÑÑ Ð²Ñзовов, а заÑем опиÑÑваÑÑÑÑ
       ÑазлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸.

       ÐÑзов recv() оÑлиÑаеÑÑÑ Ð¾Ñ read(2) ÑолÑко налиÑием
       аÑгÑменÑа flags. ÐÑли знаÑение flags Ñавно нÑлÑ,
       Ñо вÑзов recv() ÑквиваленÑен read(2) (но ÑмоÑÑиÑе
       ÐÐÐÐЧÐÐÐЯ). Также, вÑзов

           recv(sockfd, buf, len, flags);

       ÑквиваленÑен

           recvfrom(sockfd, buf, len, flags, NULL, NULL);

       ÐÑи ÑÑпеÑном вÑполнении вÑе ÑÑи вÑзова
       возвÑаÑаÑÑ Ð´Ð»Ð¸Ð½Ñ ÑообÑениÑ. ÐÑли ÑообÑение
       ÑлиÑком длинное и не помеÑÑилоÑÑ Ð²
       пÑедоÑÑавленнÑй бÑÑеÑ, лиÑние байÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ
       оÑбÑоÑенÑ, в завиÑимоÑÑи Ð¾Ñ Ñипа ÑокеÑа, на
       коÑоÑом пÑинимаÑÑÑÑ ÑообÑениÑ.

       ÐÑли на ÑокеÑе не доÑÑÑпно ни одного
       ÑообÑениÑ, Ñо обÑÑждаемÑе вÑÐ·Ð¾Ð²Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¸Ñ
       пÑибÑÑиÑ, еÑли ÑÐ¾ÐºÐµÑ Ð½Ðµ помеÑен как
       неблокиÑÑÑÑий (Ñм. fcntl(2)), в пÑоÑивном ÑлÑÑае
       возвÑаÑаеÑÑÑ Ð·Ð½Ð°Ñение -1, а внеÑнÑÑ
       пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ errno ÑÑÑанавливаеÑÑÑ Ð² знаÑение
       EAGAIN или EWOULDBLOCK. ÐÑе ÑÑи вÑÐ·Ð¾Ð²Ñ Ð¾Ð±ÑÑно ÑÑазÑ
       возвÑаÑаÑÑ Ð²Ñе доÑÑÑпнÑе даннÑе вплоÑÑ Ð´Ð¾
       запÑоÑенного обÑема, а не ждÑÑ, пока
       поÑвÑÑÑÑ Ð´Ð°Ð½Ð½Ñе полной запÑоÑенной длинÑ.

       ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð²
       ÑокеÑе пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ
       select(2), poll(2) или epoll(7).

   ÐÑгÑÐ¼ÐµÐ½Ñ Ñлагов
       ÐÑгÑÐ¼ÐµÐ½Ñ flags ÑоÑмиÑÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð±ÑединениÑ
       логиÑеÑкой опеÑаÑией ÐÐРодного или более
       ÑледÑÑÑÐ¸Ñ Ð·Ð½Ð°Ñений:

       MSG_CMSG_CLOEXEC (ÑолÑко Ð´Ð»Ñ recvmsg(); наÑÐ¸Ð½Ð°Ñ Ñ Linux
       2.6.23)
              УÑÑановиÑÑ Ñлаг close-on-exec Ð´Ð»Ñ Ñайлового
              деÑкÑипÑоÑа, полÑÑенного ÑеÑез
              доменнÑй ÑайловÑй деÑкÑипÑÐ¾Ñ UNIX, Ñ
              помоÑÑÑ Ð¾Ð¿ÐµÑаÑии SCM_RIGHTS (опиÑана в
              unix(7)). ÐÑÐ¾Ñ Ñлаг полезен по Ñем же
              пÑиÑинам ÑÑо и Ñлаг O_CLOEXEC Ñ open(2).

       MSG_DONTWAIT (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.2)
              ÐклÑÑиÑÑ Ð½ÐµÐ±Ð»Ð¾ÐºÐ¸ÑÑÑÑий Ñежим. ÐÑли
              опеÑаÑÐ¸Ñ Ð¼Ð¾Ð³Ð»Ð° Ð±Ñ Ð¿ÑивеÑÑи к
              блокиÑовке, возвÑаÑаеÑÑÑ EAGAIN или
              EWOULDBLOCK. Такое поведение подобно
              Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñлага O_NONBLOCK (в fcntl(2) опеÑаÑией
              F_SETFL), но оÑлиÑие в Ñом, ÑÑо MSG_DONTWAIT
              ÑказÑваеÑÑÑ Ð² вÑзове, а O_NONBLOCK задаÑÑÑÑ Ð²
              опиÑании оÑкÑÑÑого Ñайла (ÑмоÑÑиÑе open(2)),
              ÑÑо влиÑÐµÑ Ð½Ð° вÑе ниÑи вÑзÑваÑÑего
              пÑоÑеÑÑа, а Ñакже на дÑÑгие пÑоÑеÑÑÑ, Ñ
              коÑоÑÑÑ ÐµÑÑÑ ÑайловÑе деÑкÑипÑоÑÑ,
              ÑÑÑлаÑÑиеÑÑ Ð½Ð° ÑÑо опиÑание оÑкÑÑÑого
              Ñайла.

       MSG_ERRQUEUE (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.2)
              Указание ÑÑого Ñлага позволÑеÑ
              полÑÑиÑÑ Ð¸Ð· оÑеÑеди оÑибок ÑокеÑа
              накопивÑиеÑÑ Ð¾Ñибки. ÐÑибка пеÑедаÑÑÑÑ Ð²
              вÑпомогаÑелÑном ÑообÑении Ñип
              коÑоÑого завиÑÐ¸Ñ Ð¾Ñ Ð¿ÑоÑокола (Ð´Ð»Ñ IPv4
              ÑÑо IP_RECVERR). ÐÑзÑваÑÑий должен
              пÑедоÑÑавиÑÑ Ð±ÑÑÐµÑ Ð´Ð¾ÑÑаÑоÑного ÑазмеÑа.
              ÐополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¿Ñиведена в
              cmsg(3) и ip(7). СодеÑжимое иÑÑодного
              пакеÑа, коÑоÑÑй пÑивÑл к оÑибке,
              пеÑедаÑÑÑÑ Ð² виде обÑÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ ÑеÑез
              msg_iovec. ÐÑÑоднÑй адÑÐµÑ Ð½Ð°Ð·Ð½Ð°ÑениÑ
              даÑагÑаммÑ, коÑоÑÐ°Ñ Ð¿Ñивела к оÑибке,
              пеÑедаÑÑÑÑ ÑеÑез msg_name.

              ÐÐ»Ñ Ð»Ð¾ÐºÐ°Ð»ÑнÑÑ Ð¾Ñибок адÑÐµÑ Ð½Ðµ пеÑедаÑÑÑÑ
              (ÑÑо можно вÑÑÑниÑÑ, пÑовеÑив поле cmsg_len
              ÑÑÑÑкÑÑÑÑ cmsghdr). ÐÐ»Ñ Ð¾Ñибок пÑи пÑиÑме
              ÑÑÑанавливаеÑÑÑ Ñлаг MSG_ERRQUEUE в msghdr.
              ÐоÑле Ñого, как оÑибка пеÑедана
              пÑогÑамме, ÑледÑÑÑÐ°Ñ Ð¾Ñибка в оÑеÑеди
              оÑибок ÑÑановиÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑей оÑибкой и
              пеÑедаеÑÑÑ Ð¿ÑогÑамме пÑи ÑледÑÑÑей
              опеÑаÑии на ÑокеÑе.

              ÐÑибка пеÑедаÑÑÑÑ Ð² виде ÑÑÑÑкÑÑÑÑ
              sock_extended_err:

                  #define SO_EE_ORIGIN_NONE    0
                  #define SO_EE_ORIGIN_LOCAL   1
                  #define SO_EE_ORIGIN_ICMP    2
                  #define SO_EE_ORIGIN_ICMP6   3

                  struct sock_extended_err
                  {
                      uint32_t ee_errno;   /* Ð½Ð¾Ð¼ÐµÑ Ð¾Ñибки */
                      uint8_t  ee_origin;  /* иÑÑоÑник ÐµÑ Ð¿ÑоиÑÑÐ¾Ð¶Ð´ÐµÐ½Ð¸Ñ */
                      uint8_t  ee_type;    /* Ñип */
                      uint8_t  ee_code;    /* код */
                      uint8_t  ee_pad;     /* заполнение Ð´Ð»Ñ Ð²ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ */
                      uint32_t ee_info;    /* дополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ */
                      uint32_t ee_data;    /* пÑоÑие даннÑе */
                      /* далее могÑÑ ÑодеÑжаÑÑÑÑ ÐµÑÑ Ð´Ð°Ð½Ð½Ñе */
                  };

                  struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

              Ð ee_errno ÑодеÑжиÑÑÑ Ð·Ð½Ð°Ñение errno длÑ
              ожидаÑÑей оÑибки. Ð ee_origin ÑодеÑжиÑÑÑ
              иÑÑоÑник пÑоиÑÑÐ¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ñибки. СмÑÑл
              оÑÑалÑнÑÑ Ð¿Ð¾Ð»ÐµÐ¹ завиÑÐ¸Ñ Ð¾Ñ Ð¿ÑоÑокола.
              ÐакÑÐ¾Ñ SOCK_EE_OFFENDER возвÑаÑÐ°ÐµÑ ÑказаÑелÑ
              на адÑÐµÑ ÑеÑевого обÑекÑа, поÑодивÑего
              оÑибкÑ. ÐÑли ÑÑÐ¾Ñ Ð°Ð´ÑÐµÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑен, Ñо
              поле sa_family ÑÑÑÑкÑÑÑÑ sockaddr ÑодеÑжиÑ
              знаÑение AF_UNSPEC, а пÑоÑие Ð¿Ð¾Ð»Ñ ÑÑÑÑкÑÑÑÑ
              sockaddr не опÑеделенÑ. СодеÑжимое
              пакеÑа, вÑзвавÑего оÑибкÑ, пеÑедаÑÑÑÑ Ð²
              виде обÑÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ.

              ÐÐ»Ñ Ð»Ð¾ÐºÐ°Ð»ÑнÑÑ Ð¾Ñибок адÑÐµÑ Ð½Ðµ пеÑедаÑÑÑÑ
              (ÑÑо можно вÑÑÑниÑÑ, пÑовеÑив поле cmsg_len
              ÑÑÑÑкÑÑÑÑ cmsghdr). ÐÐ»Ñ Ð¾Ñибок пÑи пÑиÑме
              ÑÑÑанавливаеÑÑÑ Ñлаг MSG_ERRQUEUE в msghdr.
              ÐоÑле Ñого, как оÑибка пеÑедана
              пÑогÑамме, ÑледÑÑÑÐ°Ñ Ð¾Ñибка в оÑеÑеди
              оÑибок ÑÑановиÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑей оÑибкой и
              пеÑедаеÑÑÑ Ð¿ÑогÑамме пÑи ÑледÑÑÑей
              опеÑаÑии на ÑокеÑе.

       MSG_OOB
              ÐÑÐ¾Ñ Ñлаг запÑаÑÐ¸Ð²Ð°ÐµÑ Ð¿ÑиÑм внеполоÑнÑÑ
              даннÑÑ, коÑоÑÑе в пÑоÑивном ÑлÑÑае не
              бÑли Ð±Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ð² обÑÑном поÑоке
              даннÑÑ. ÐекоÑоÑÑе пÑоÑÐ¾ÐºÐ¾Ð»Ñ Ð¿Ð¾Ð¼ÐµÑаÑÑ
              даннÑе повÑÑенной ÑÑоÑноÑÑи в наÑало
              оÑеÑеди Ñ Ð¾Ð±ÑÑнÑми даннÑми, и поÑÑÐ¾Ð¼Ñ ÑÑоÑ
              Ñлаг не Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ñ Ñакими
              пÑоÑоколами.

       MSG_PEEK
              ÐÑÐ¾Ñ Ñлаг заÑÑавлÑÐµÑ Ð²ÑбÑаÑÑ Ð´Ð°Ð½Ð½Ñе из
              наÑала оÑеÑеди пÑиÑма, но не ÑдалÑÑÑ Ð¸Ñ
              оÑÑÑда. Таким обÑазом, поÑледÑÑÑий
              вÑзов веÑнÑÑ Ñе же ÑамÑе даннÑе.

       MSG_TRUNC (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.2)
              ÐÐ»Ñ Â«ÑÑÑÑÑ» даннÑÑ (AF_PACKET), дейÑагÑамм
              ÐнÑеÑнеÑа (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.4.27/2.6.8), netlink
              (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.22) и дейÑагÑамм UNIX
              (наÑÐ¸Ð½Ð°Ñ Ñ Linux 3.4) возвÑаÑÐ°ÐµÑ ÑеалÑнÑÑ
              Ð´Ð»Ð¸Ð½Ñ Ð¿Ð°ÐºÐµÑа или дейÑагÑаммÑ, даже
              еÑли она бÑла болÑÑе, Ñем
              пÑедоÑÑавленнÑй бÑÑеÑ.

              ÐпиÑание иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¿Ð¾ÑоковÑм
              ÑокеÑами ÐнÑеÑнеÑа ÑмоÑÑиÑе в tcp(7).

       MSG_WAITALL (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.2)
              ÐÑим Ñлагом вклÑÑаеÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñование
              опеÑаÑии до полной обÑабоÑки запÑоÑа.
              Ðднако, ÑÑÐ¾Ñ Ð²Ñзов вÑÑ Ñавно Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑнÑÑÑ
              менÑÑе даннÑÑ, Ñем бÑло запÑоÑено, еÑли
              бÑл пойман Ñигнал, пÑоизоÑла оÑибка
              или ÑазÑÑв ÑоединениÑ, или еÑли наÑали
              поÑÑÑпаÑÑ Ð´Ð°Ð½Ð½Ñе дÑÑгого Ñипа, не Ñого,
              коÑоÑÑй бÑл ÑнаÑала. ÐÑÐ¾Ñ Ñлаг не влиÑеÑ
              на даÑагÑаммнÑе ÑокеÑÑ.

   recvfrom()
       ÐÑзов recvfrom() помеÑÐ°ÐµÑ Ð¿ÑинÑÑое ÑообÑение в
       бÑÑÐµÑ buf. ÐÑзÑваÑÑий должен ÑказаÑÑ ÑазмеÑ
       бÑÑеÑа в len.

       ÐÑли знаÑение src_addr не Ñавно NULL, и в
       нижележаÑем пÑоÑоколе иÑполÑзÑеÑÑÑ Ð°Ð´ÑеÑ
       иÑÑоÑника ÑообÑениÑ, Ñо адÑÐµÑ Ð¸ÑÑоÑника
       помеÑаеÑÑÑ Ð² бÑÑеÑ, ÑказаннÑй в src_addr. Ð ÑÑом
       ÑлÑÑае addrlen ÑвлÑеÑÑÑ Ð°ÑгÑменÑом-ÑезÑлÑÑаÑом.
       ÐеÑед вÑзовом ÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ Ð¿ÑиÑвоено
       знаÑение Ð´Ð»Ð¸Ð½Ñ Ð±ÑÑеÑа, ÑвÑзанного Ñ src_addr.
       ÐÑи возвÑаÑе addrlen обновлÑеÑÑÑ Ð¸ ÑодеÑжиÑ
       дейÑÑвиÑелÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð°Ð´ÑеÑа иÑÑоÑника.
       ÐозвÑаÑаемÑй адÑÐµÑ Ð¾Ð±ÑезаеÑÑÑ, еÑли
       пÑедоÑÑавленнÑй бÑÑÐµÑ ÑлиÑком мал; в ÑÑом
       ÑлÑÑае addrlen бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð·Ð½Ð°Ñение болÑÑее,
       Ñем ÑказÑвалоÑÑ Ð² вÑзове.

       ÐÑли вÑзÑваÑÑÐµÐ¼Ñ Ð°Ð´ÑÐµÑ Ð¸ÑÑоÑника не нÑжен, Ñо
       знаÑение src_addr и addrlen должно бÑÑÑ Ñавно NULL.

   recv()
       ÐÑзов recv(), обÑÑно, иÑполÑзÑеÑÑÑ ÑолÑко на
       ÑоединÑнном ÑокеÑе (ÑмоÑÑиÑе connect(2)). Ðн
       иденÑиÑен вÑзовÑ:

           recvfrom(fd, buf, len, flags, NULL, 0);

   recvmsg()
       ÐÐ»Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð¸Ð·Ð°Ñии колиÑеÑÑва пеÑедаваемÑÑ
       аÑгÑменÑов в вÑзов recvmsg() иÑполÑзÑеÑÑÑ ÑÑÑÑкÑÑÑа
       msghdr. Ðна опÑеделена в <sys/socket.h> ÑледÑÑÑим
       обÑазом:

           struct iovec {                    /* маÑÑив ÑлеменÑов пÑиÑма/пеÑедаÑи */
               void  *iov_base;              /* наÑалÑнÑй адÑÐµÑ */
               size_t iov_len;               /* колиÑеÑÑво пеÑедаваемÑÑ Ð±Ð°Ð¹Ñ */
           };

           struct msghdr {
               void         *msg_name;       /* необÑзаÑелÑнÑй адÑÐµÑ */
               socklen_t     msg_namelen;    /* ÑÐ°Ð·Ð¼ÐµÑ Ð°Ð´ÑеÑа */
               struct iovec *msg_iov;        /* маÑÑив пÑиÑма/пеÑедаÑи */
               size_t        msg_iovlen;     /* колиÑеÑÑво ÑлеменÑов в msg_iov */
               void         *msg_control;    /* вÑпомогаÑелÑнÑе даннÑе,
                                                Ñм. ниже */
               size_t        msg_controllen; /* ÑÐ°Ð·Ð¼ÐµÑ Ð±ÑÑеÑа вÑпомогаÑелÑнÑÑ
                                                даннÑÑ */
               int           msg_flags;      /* Ñлаги пÑинÑÑого ÑообÑÐµÐ½Ð¸Ñ */
           };

       Ðоле msg_name ÑказÑÐ²Ð°ÐµÑ Ð½Ð° вÑделеннÑй
       вÑзÑваÑÑим бÑÑеÑ, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð´Ð»Ñ
       возвÑаÑа адÑеÑа иÑÑоÑника, еÑли ÑÐ¾ÐºÐµÑ Ð½Ðµ
       ÑоединÑн. ÐÑзÑваÑÑий должен ÑказаÑÑ Ð² msg_namelen
       ÑÐ°Ð·Ð¼ÐµÑ ÑÑого бÑÑеÑа пеÑед вÑзовом; пÑи
       ÑÑпеÑном вÑполнении вÑзова в msg_namelen бÑдеÑ
       ÑодеÑжаÑÑÑÑ Ð´Ð»Ð¸Ð½Ð° возвÑаÑаемого адÑеÑа. ÐÑли
       пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ нÑжно знаÑÑ Ð°Ð´ÑÐµÑ Ð¸ÑÑоÑника,
       Ñо в msg_name можно ÑказаÑÑ NULL.

       РполÑÑ msg_iov и msg_iovlen опиÑÑваÑÑÑÑ Ð¼ÐµÑÑо
       пÑиÑма/пеÑедаÑи, обÑÑждаемÑе в readv(2).

       Ðоле msg_control длиной msg_controllen ÑказÑÐ²Ð°ÐµÑ Ð½Ð°
       бÑÑÐµÑ Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ ÑообÑений, ÑвÑзаннÑÑ Ñ
       ÑпÑавлением пÑоÑоколом или на бÑÑÐµÑ Ð´Ð»Ñ
       ÑазнообÑазнÑÑ Ð²ÑпомогаÑелÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ. ÐÑи
       вÑзове recvmsg() в поле msg_controllen должен
       ÑказÑваÑÑÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð¾ÑÑÑпного бÑÑеÑа, Ñей адÑеÑ
       пеÑедан в msg_control; пÑи ÑÑпеÑном вÑполнении
       вÑзова в ÑÑом паÑамеÑÑе бÑÐ´ÐµÑ Ð½Ð°ÑодиÑÑÑÑ
       длина поÑледоваÑелÑноÑÑи конÑÑолÑнÑÑ
       ÑообÑений.

       СообÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÑÑ ÑледÑÑÑий вид:

           struct cmsghdr {
               size_t cmsg_len;    /* ÑÑеÑÑик байÑов даннÑÑ Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð¼
                                      (Ñип â socklen_t в POSIX) */
               int    cmsg_level;  /* наÑалÑнÑй пÑоÑокол */
               int    cmsg_type;   /* Ñип, завиÑÑÑий Ð¾Ñ Ð¿ÑоÑокола */
           /* поÑле
              unsigned char cmsg_data[]; */
           };

       РвÑпомогаÑелÑнÑм даннÑм нÑжно обÑаÑаÑÑÑÑ
       ÑолÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼Ð°ÐºÑоÑов, опÑеделÑннÑÑ Ð²
       cmsg(3).

       ÐапÑимеÑ, ÑÑÐ¾Ñ Ð¼ÐµÑанизм вÑпомогаÑелÑнÑÑ
       даннÑÑ Ð¸ÑполÑзÑеÑÑÑ Ð² Linux Ð´Ð»Ñ Ð¿ÐµÑедаÑи
       ÑаÑÑиÑеннÑÑ Ð¾Ñибок, Ñлагов IP и ÑайловÑÑ
       деÑкÑипÑоÑов ÑеÑез доменнÑе ÑокеÑÑ Unix.

       ÐÑи возвÑаÑе из recvmsg() ÑÑÑанавливаеÑÑÑ
       знаÑение Ð¿Ð¾Ð»Ñ msg_flags в msghdr. Ðно можеÑ
       ÑодеÑжаÑÑ Ð½ÐµÑколÑко Ñлагов:

       MSG_EOR
              ознаÑÐ°ÐµÑ ÐºÐ¾Ð½ÐµÑ Ð·Ð°Ð¿Ð¸Ñи: возвÑаÑÑннÑе
              даннÑе заканÑиваÑÑ Ð·Ð°Ð¿Ð¸ÑÑ (обÑÑно
              иÑполÑзÑеÑÑÑ Ð²Ð¼ÐµÑÑе Ñ ÑокеÑами Ñипа
              SOCK_SEQPACKET).

       MSG_TRUNC
              ознаÑаеÑ, ÑÑо ÑвоÑÑÐ¾Ð²Ð°Ñ ÑаÑÑÑ Ð´Ð°ÑагÑаммÑ
              бÑла оÑбÑоÑена, поÑÐ¾Ð¼Ñ ÑÑо даÑагÑамма
              бÑла болÑÑе, Ñем пÑедоÑÑавленнÑй бÑÑеÑ.

       MSG_CTRUNC
              ознаÑаеÑ, ÑÑо ÑаÑÑÑ ÑпÑавлÑÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð±Ñла
              оÑбÑоÑена из-за недоÑÑаÑка меÑÑа в
              бÑÑеÑе вÑпомогаÑелÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ.

       MSG_OOB
              возвÑаÑаеÑÑÑ Ð´Ð»Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñии полÑÑениÑ
              внеполоÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ.

       MSG_ERRQUEUE
              ознаÑаеÑ, ÑÑо бÑли полÑÑÐµÐ½Ñ Ð½Ðµ даннÑе, а
              ÑаÑÑиÑенное ÑообÑение об оÑибке из
              оÑеÑеди оÑибок ÑокеÑа.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи вÑÐ·Ð¾Ð²Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво пÑинÑÑÑÑ Ð±Ð°Ð¹Ñ
       или -1, еÑли пÑоизоÑла оÑибка. Ð ÑлÑÑае
       оÑибки в errno запиÑÑваеÑÑÑ ÐºÐ¾Ð´ оÑибки.

       Ðогда оÑвеÑÐ½Ð°Ñ ÑÑоÑона поÑока вÑполнÑеÑ
       коÑÑекÑное оÑклÑÑение (shutdown), Ñо возвÑаÑаеÑÑÑ
       0 (обÑÑнÑй возвÑÐ°Ñ Â«ÐºÐ¾Ð½ÐµÑ Ñайла»).

       РдаÑагÑамнÑÑ ÑокеÑÐ°Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð²
       (напÑимеÑ, Ð´Ð¾Ð¼ÐµÐ½Ð°Ñ UNIX и Internet) ÑазÑеÑенÑ
       даÑагÑÐ°Ð¼Ð¼Ñ Ð½Ñлевой длинÑ. ÐÑи полÑÑении
       Ñакой даÑагÑÐ°Ð¼Ð¼Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð·Ð½Ð°Ñение 0.

       Также знаÑение 0 Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ, еÑли
       запÑоÑенное колиÑеÑÑво пÑинимаемÑÑ Ð±Ð°Ð¹Ñ Ð¸Ð·
       поÑокового ÑокеÑа Ñавно 0.

ÐШÐÐÐÐ
       ÐдеÑÑ Ð¿ÑедÑÑавлено неÑколÑко ÑÑандаÑÑнÑÑ
       оÑибок, возвÑаÑаемÑÑ Ñ ÑÑÐ¾Ð²Ð½Ñ ÑокеÑов. ÐогÑÑ
       Ñакже поÑвиÑÑÑÑ Ð´ÑÑгие оÑибки, возвÑаÑаемÑе
       из ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð¿ÑоÑоколÑнÑÑ Ð¼Ð¾Ð´Ñлей; иÑ
       опиÑание наÑодиÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑпÑавоÑнÑÑ
       ÑÑÑаниÑаÑ.

       EAGAIN или EWOULDBLOCK
              Ð¡Ð¾ÐºÐµÑ Ð¿Ð¾Ð¼ÐµÑен как неблокиÑÑемÑй, а
              опеÑаÑÐ¸Ñ Ð¿ÑиÑма пÑивела Ð±Ñ Ðº
              блокиÑовке, или ÑÑÑановлено вÑемÑ
              Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ ÑÑо вÑÐµÐ¼Ñ Ð¸ÑÑекло до
              полÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ. СоглаÑно POSIX.1 в ÑÑом
              ÑлÑÑае Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ Ð»ÑÐ±Ð°Ñ Ð¾Ñибка и
              не ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÑÑи конÑÑанÑÑ Ð¸Ð¼ÐµÐ»Ð¸
              одинаковое знаÑение, поÑÑомÑ
              пеÑеноÑимое пÑиложение должно
              пÑовеÑиÑÑ Ð¾Ð±Ð° ÑлÑÑаÑ.

       EBADF  ÐÑгÑÐ¼ÐµÐ½Ñ sockfd ÑодеÑÐ¶Ð¸Ñ Ð½ÐµÐ²ÐµÑнÑй ÑайловÑй
              деÑкÑипÑоÑ.

       ECONNREFUSED
              УдалÑннÑй Ñзел оÑказалÑÑ ÑÑÑанавливаÑÑ
              ÑеÑевое Ñоединение (обÑÑно поÑомÑ, ÑÑо
              Ñам не ÑабоÑÐ°ÐµÑ Ð·Ð°Ð¿ÑоÑÐµÐ½Ð½Ð°Ñ ÑлÑжба).

       EFAULT УказаÑÐµÐ»Ñ Ð½Ð° пÑиÑмнÑй бÑÑÐµÑ ÑказÑваеÑ
              вне адÑеÑного пÑоÑÑÑанÑÑва пÑоÑеÑÑа.

       EINTR  ÐÑиÑм даннÑÑ Ð±Ñл пÑеÑван Ñигналом, а
              даннÑе еÑÑ Ð½Ðµ бÑли доÑÑÑпнÑ; Ñм. signal(7).

       EINVAL ÐеÑедан невеÑнÑй аÑгÑменÑ.

       ENOMEM Ðе ÑдалоÑÑ Ð²ÑделиÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð´Ð»Ñ recvmsg().

       ENOTCONN
              СокеÑ, ÑвÑзаннÑй Ñ Ð¿ÑоÑоколом,
              оÑиенÑиÑованнÑм на Ñоединение, не бÑл
              ÑоединÑн (Ñм. connect(2) и accept(2)).

       ENOTSOCK
              ФайловÑй деÑкÑипÑÐ¾Ñ sockfd ÑказÑÐ²Ð°ÐµÑ Ð½Ðµ
              на каÑалог.

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       POSIX.1-2001, POSIX.1-2008, 4.4BSD (ÑÑи инÑеÑÑейÑÑ Ð²Ð¿ÐµÑвÑе
       поÑвилиÑÑ Ð² 4.2BSD).

       Ð POSIX.1 опиÑÐ°Ð½Ñ ÑолÑко Ñлаги MSG_OOB, MSG_PEEK и
       MSG_WAITALL.

ÐÐÐÐЧÐÐÐЯ
       ÐÑли Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð´ÐµÐ¹ÑагÑамма нÑлевой длинÑ, Ñо
       read(2) и recv() Ñ Ð½ÑлевÑм аÑгÑменÑом flags ÑабоÑаÑÑ
       по-ÑазномÑ. Ð ÑÑом ÑлÑÑае read(2) ниÑего не
       Ð´ÐµÐ»Ð°ÐµÑ (дейÑагÑамма пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ Ð¶Ð´Ð°ÑÑ), а
       recv() обÑабаÑÑÐ²Ð°ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑÑÑ Ð´ÐµÐ¹ÑагÑаммÑ.

       Тип socklen_t поÑвилÑÑ Ð¸Ð· POSIX. Также ÑмоÑÑиÑе
       accept(2).

       Ð ÑооÑвеÑÑÑвие Ñ POSIX.1 поле msg_controllen ÑÑÑÑкÑÑÑÑ
       msghdr должно имеÑÑ Ñип socklen_t, но в наÑÑоÑÑее
       вÑÐµÐ¼Ñ Ð² glibc оно Ð¸Ð¼ÐµÐµÑ Ñип size_t.

       Ð recvmmsg(2) можно найÑи инÑоÑмаÑÐ¸Ñ Ð¾
       ÑпеÑиалÑном ÑиÑÑемном вÑзове Linux, коÑоÑÑй
       можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿ÑиÑма неÑколÑкиÑ
       даÑагÑамм за один вÑзов.

ÐÐ ÐÐÐÐ
       ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ recvfrom() показан в
       getaddrinfo(3).

СÐÐТРÐТРТÐÐÐÐ
       fcntl(2), getsockopt(2), read(2), recvmmsg(2), select(2), shutdown(2),
       socket(2), cmsg(3), sockatmark(3), socket(7)



Linux                             2016-07-17                           RECV(2)