sendmmsg(2) | System Calls Manual | 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, 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
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.
2 mai 2024 | Pagini de manual de Linux 6.8 |