Provided by: manpages-ro-dev_4.27.0-1_all bug

NUME

       sendmmsg - trimite mai multe mesaje printr-un soclu

BIBLIOTECA

       Biblioteca C standard (libc, -lc)

SINOPSIS

       #define _GNU_SOURCE         /* Consultați feature_test_macros(7) */
       #include <sys/socket.h>

       int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
                    int flags);

DESCRIERE

       Apelul  de sistem sendmmsg() este o extensie a sendmsg(2) care permite apelantului să transmită mai multe
       mesaje printr-un soclu folosind un singur apel de sistem;  (acest  lucru  are  beneficii  de  performanță
       pentru unele aplicații).

       Argumentul sockfd este descriptorul de fișier al soclului prin care urmează să fie transmise datele.

       Argumentul  msgvec  este  un  indicator  la  o matrice de structuri mmsghdr. Mărimea acestei matrice este
       specificată în vlen.

       Structura mmsghdr este definită în <sys/socket.h> ca:

           struct mmsghdr {
               struct msghdr msg_hdr;  /* Antetul mesajului */
               unsigned int  msg_len;  /* Numărul de octeți transmiși */
           };

       Câmpul msg_hdr este o structură msghdr, astfel cum este  descrisă  în  sendmsg(2).  Câmpul  msg_len  este
       utilizat  pentru  a  returna numărul de octeți trimiși din mesaj în msg_hdr (adică aceeași valoare ca cea
       returnată de la un singur apel sendmsg(2)).

       Argumentul flags conține fanioane și OR binare combinate împreună. Fanioanele  sunt  aceleași  ca  pentru
       sendmsg(2).

       Un  apel  blocant  sendmmsg()  blochează până când au fost trimise vlen mesaje. Un apel care nu blochează
       trimite cât mai multe mesaje posibil (până la limita specificată de vlen) și returnează imediat.

       La returnarea de la sendmmsg(), câmpurile msg_len ale elementelor succesive ale msgvec  sunt  actualizate
       pentru  a  conține numărul de octeți transmis din msg_hdr corespunzător. Valoarea de returnare a apelului
       indică numărul de elemente din msgvec care au fost actualizate.

VALOAREA RETURNATĂ

       În caz de succes, sendmmsg() returnează numărul de mesaje trimise din msgvec; dacă acesta  este  mai  mic
       decât vlen, apelantul poate încerca din nou cu un alt apel sendmmsg() pentru a trimite mesajele rămase.

       În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

       Erorile  sunt  aceleași  ca la sendmsg(2). O eroare este returnată numai dacă nu se poate trimite nici un
       datagramă. A se vedea, de asemenea, secțiunea ERORI.

STANDARDE

       Linux.

ISTORIC

       Linux 3.0, glibc 2.14.

NOTE

       Valoarea specificată în vlen este limitată la UIO_MAXIOV (1024).

ERORI

       Dacă apare o eroare după ce a fost trimis cel puțin un mesaj, apelul reușește și  returnează  numărul  de
       mesaje  trimise.  Codul  de eroare se pierde. Apelantul poate încerca din nou transmiterea, pornind de la
       primul mesaj eșuat, dar nu există nicio garanție că, în cazul în care se returnează o eroare, aceasta  va
       fi aceeași cu cea care a fost pierdută la apelul anterior.

EXEMPLE

       Exemplul  de  mai  jos  utilizează  sendmmsg()  pentru  a  trimite  unu-doi și trei în două datagrame UDP
       distincte utilizând un singur apel de sistem. Conținutul primei  datagrame  provine  dintr-o  pereche  de
       memorii tampon.

       #define _GNU_SOURCE
       #include <arpa/inet.h>
       #include <netinet/in.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include <sys/socket.h>
       #include <sys/types.h>

       int
       main(void)
       {
           int                 retval;
           int                 sockfd;
           struct iovec        msg1[2], msg2;
           struct mmsghdr      msg[2];
           struct sockaddr_in  addr;

           sockfd = socket(AF_INET, SOCK_DGRAM, 0);
           if (sockfd == -1) {
               perror("socket()");
               exit(EXIT_FAILURE);
           }

           addr.sin_family = AF_INET;
           addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
           addr.sin_port = htons(1234);
           if (connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
               perror("connect()");
               exit(EXIT_FAILURE);
           }

           memset(msg1, 0, sizeof(msg1));
           msg1[0].iov_base = "unu";
           msg1[0].iov_len = 3;
           msg1[1].iov_base = "doi";
           msg1[1].iov_len = 3;

           memset(&msg2, 0, sizeof(msg2));
           msg2.iov_base = "trei";
           msg2.iov_len = 5;

           memset(msg, 0, sizeof(msg));
           msg[0].msg_hdr.msg_iov = msg1;
           msg[0].msg_hdr.msg_iovlen = 2;

           msg[1].msg_hdr.msg_iov = &msg2;
           msg[1].msg_hdr.msg_iovlen = 1;

           retval = sendmmsg(sockfd, msg, 2, 0);
           if (retval == -1)
               perror("sendmmsg()");
           else
               printf("%d mesaje trimise\n", retval);

           exit(0);
       }

CONSULTAȚI ȘI

       recvmmsg(2), sendmsg(2), socket(2), socket(7)

TRADUCERE

       Traducerea    în   limba   română   a   acestui   manual   a   fost   făcută   de   Remus-Gabriel   Chelu
       <remusgabriel.chelu@disroot.org>

       Această traducere este  documentație  gratuită;  citiți  Licența publică generală GNU Versiunea 3  sau  o
       versiune   ulterioară   cu  privire  la  condiții  privind  drepturile  de  autor.   NU  se  asumă  NICIO
       RESPONSABILITATE.

       Dacă găsiți erori în traducerea acestui manual, vă rugăm să  trimiteți  un  e-mail  la  translation-team-
       ro@lists.sourceforge.net.

Pagini de manual de Linux 6.9.1                   15 iunie 2024                                      sendmmsg(2)