sendmmsg(2)

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[.n], unsigned int n,
             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 n.

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 n mesaje. Un apel care nu blochează trimite cât mai multe mesaje posibil (până la limita specificată de n) ș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 n, 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 n 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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.