table of contents
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 Linux (nepublicate) |