sendmmsg(2)

الاسم
sendmmsg - إرسال رسائل متعددة على مقبس

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#define _GNU_SOURCE         /* انظر feature_test_macros(7) */
#include <sys/socket.h>

int sendmmsg(unsigned int n;
             int sockfd, struct mmsghdr msgvec[n], unsigned int n,
             int flags);

الوصف
استدعاء النظام sendmmsg() هو امتداد لـ sendmsg(2) يسمح للمستدعي بإرسال رسائل متعددة على مقبس باستخدام استدعاء نظام واحد. (هذا يوفر فوائد أداء لبعض التطبيقات.)

الوسيط sockfd هو واصف ملف المقبس الذي سيتم إرسال البيانات عليه.

المعامل msgvec هو مؤشر لمصفوفة من هياكل mmsghdr. حُدد حجم هذه المصفوفة في n.

عُرف هيكل mmsghdr في <sys/socket.h> كالتالي:

    struct mmsghdr {
        struct msghdr msg_hdr;  /* رأس الرسالة */
        unsigned int  msg_len;  /* عدد البايتات المرسلة */
    };

الحقل msg_hdr هو بنية msghdr، كما هو موصوف في sendmsg(2). يُستخدم الحقل msg_len لإرجاع عدد البايتات المرسلة من الرسالة في msg_hdr (أي نفس قيمة الإرجاع من استدعاء sendmsg(2) واحد).

الوسيط flags يحتوي على أعلام مدمجة بعملية OR. الأعلام هي نفسها المستخدمة في sendmsg(2).

استدعاء sendmmsg() المحظور يظل محظورًا حتى يتم إرسال n رسالة. الاستدعاء غير المحظور يرسل أكبر عدد ممكن من الرسائل (حتى الحد المحدد بواسطة n) ويعود فورًا.

عند العودة من sendmmsg()، يتم تحديث حقول msg_len للعناصر المتتالية من msgvec لتحتوي على عدد البايتات المرسلة من msg_hdr المقابل. تشير قيمة إرجاع الاستدعاء إلى عدد عناصر msgvec التي تم تحديثها.

قيمة الإرجاع
عند النجاح، يُرجع sendmmsg() عدد الرسائل المرسلة من msgvec؛ إذا كان هذا أقل من n، يمكن للمستدعي إعادة المحاولة باستدعاء sendmmsg() آخر لإرسال الرسائل المتبقية.

عند الخطأ، تُعاد القيمة -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء
الأخطاء هي نفسها لـ sendmsg(2). يتم إرجاع خطأ فقط إذا لم يمكن إرسال أي رزم بيانات. انظر أيضًا الأخطاء.

المعايير
لينكس.

التاريخ
لينكس 3.0، glibc 2.14.

ملاحظات
القيمة المحددة في n محدودة بـ UIO_MAXIOV (1024).

العلل
إذا حدث خطأ بعد إرسال رسالة واحدة على الأقل، ينجح الاستدعاء، ويعيد عدد الرسائل المرسلة. يُفقد رمز الخطأ. يمكن للمستدعي إعادة محاولة الإرسال، بدءًا من أول رسالة فاشلة، ولكن لا يوجد ضمان بأنه، إذا تم إرجاع خطأ، سيكون هو نفسه الذي فُقد في الاستدعاء السابق.

أمثلة
المثال أدناه يستخدم sendmmsg() لإرسال onetwo و three في رزمتي UDP منفصلتين باستخدام استدعاء نظام واحد. محتويات أول رزمة تأتي من زوج من المخازن المؤقتة.

    #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 = "one";
        msg1[0].iov_len = 3;
        msg1[1].iov_base = "two";
        msg1[1].iov_len = 3;

        memset(&msg2, 0, sizeof(msg2));
        msg2.iov_base = "three";
        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 messages sent\n", retval);

        exit(0);
    }

انظر أيضًا
recvmmsg(2), sendmsg(2), socket(2), socket(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.