sendmmsg(2) System Calls Manual sendmmsg(2) NUME sendmmsg - trimite mai multe mesaje printr-un soclu BIBLIOTECA Biblioteca C standard (libc, -lc) REZUMAT #define _GNU_SOURCE /* Consultai feature_test_macros(7) */ #include 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 sa transmita mai multe mesaje printr-un soclu folosind un singur apel de sistem; (acest lucru are beneficii de performana pentru unele aplicaii). Argumentul sockfd este descriptorul de fiier al soclului prin care urmeaza sa fie transmise datele. Argumentul msgvec este un indicator la o matrice de structuri mmsghdr. Marimea acestei matrice este specificata in vlen. Structura mmsghdr este definita in ca: struct mmsghdr { struct msghdr msg_hdr; /* Antetul mesajului */ unsigned int msg_len; /* Numarul de octei transmii */ }; Campul msg_hdr este o structura msghdr, astfel cum este descrisa in sendmsg(2). Campul msg_len este utilizat pentru a returna numarul de octei trimii din mesaj in msg_hdr (adica aceeai valoare ca cea returnata de la un singur apel sendmsg(2)). Argumentul flags conine fanioane i OR binare combinate impreuna. Fanioanele sunt aceleai ca pentru sendmsg(2). Un apel blocant sendmmsg() blocheaza pana cand au fost trimise vlen mesaje. Un apel care nu blocheaza trimite cat mai multe mesaje posibil (pana la limita specificata de vlen) i returneaza imediat. La returnarea de la sendmmsg(), campurile msg_len ale elementelor succesive ale msgvec sunt actualizate pentru a conine numarul de octei transmis din msg_hdr corespunzator. Valoarea de returnare a apelului indica numarul de elemente din msgvec care au fost actualizate. VALOAREA RETURNATA In caz de succes, sendmmsg() returneaza numarul de mesaje trimise din msgvec; daca acesta este mai mic decat vlen, apelantul poate incerca din nou cu un alt apel sendmmsg() pentru a trimite mesajele ramase. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE Erorile sunt aceleai ca la sendmsg(2). O eroare este returnata numai daca nu se poate trimite nici un datagrama. A se vedea, de asemenea, seciunea ERORI. STANDARDE Linux. ISTORIC Linux 3.0, glibc 2.14. NOTE Valoarea specificata in vlen este limitata la UIO_MAXIOV (1024). ERORI Daca apare o eroare dupa ce a fost trimis cel puin un mesaj, apelul reuete i returneaza numarul de mesaje trimise. Codul de eroare se pierde. Apelantul poate incerca din nou transmiterea, pornind de la primul mesaj euat, dar nu exista nicio garanie ca, in cazul in care se returneaza o eroare, aceasta va fi aceeai cu cea care a fost pierduta la apelul anterior. EXEMPLE Exemplul de mai jos utilizeaza sendmmsg() pentru a trimite unu-doi i trei in doua datagrame UDP distincte utilizand un singur apel de sistem. Coninutul primei datagrame provine dintr-o pereche de memorii tampon. #define _GNU_SOURCE #include #include #include #include #include #include #include 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); } CONSULTAI I recvmmsg(2), sendmsg(2), socket(2), socket(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 31 octombrie 2023 sendmmsg(2)