.\" -*- coding: UTF-8 -*- .\" Copyright 2011, Andi Kleen .\" Copyright 2011, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Syscall added in following commit .\" commit a2e2725541fad72416326798c2d7fa4dafb7d337 .\" Author: Arnaldo Carvalho de Melo .\" Date: Mon Oct 12 23:40:10 2009 -0700 .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH recvmmsg 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم recvmmsg \- استقبال رسائل متعددة على مقبس .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#define _GNU_SOURCE\fP /* انظر feature_test_macros(7) */ \fB#include \fP .P \fBint recvmmsg(\fPunsigned int n; \fB int \fP\fIsockfd\fP\fB, struct mmsghdr \fP\fImsgvec\fP\fB[\fP\fIn\fP\fB], unsigned int \fP\fIn\fP\fB,\fP \fB int \fP\fIflags\fP\fB, struct timespec *\fP\fItimeout\fP\fB);\fP .fi .SH الوصف استدعاء النظام \fBrecvmmsg\fP() هو امتداد لـ \fBrecvmsg\fP(2) يسمح للمستدعي باستقبال رسائل متعددة من مقبس باستخدام استدعاء نظام واحد. (هذا يوفر فوائد أداء لبعض التطبيقات.) امتداد إضافي على \fBrecvmsg\fP(2) هو دعم مهلة زمنية لعملية الاستقبال. .P الوسيط \fIsockfd\fP هو واصف الملف للمقبس الذي سيتم استقبال البيانات منه. .P المعامل \fImsgvec\fP هو مؤشر لمصفوفة من هياكل \fImmsghdr\fP. حُدد حجم هذه المصفوفة في \fIn\fP. .P عُرف هيكل \fImmsghdr\fP في \fI\fP كالتالي: .P .in +4n .EX struct mmsghdr { struct msghdr msg_hdr; /* Message header */ unsigned int msg_len; /* Number of received bytes for header */ }; .EE .in .P الحقل \fImsg_hdr\fP هو بنية \fImsghdr\fP، كما هو موصوف في \fBrecvmsg\fP(2). الحقل \fImsg_len\fP هو عدد البايتات المعادة للرسالة في الإدخال. هذا الحقل له نفس قيمة القيمة المعادة لاستدعاء \fBrecvmsg\fP(2) واحد على الرأس. .P الوسيط \fIflags\fP يحتوي على أعلام مدمجة بعملية OR. الأعلام هي نفسها الموثقة لـ \fBrecvmsg\fP(2)، مع الإضافة التالية: .TP \fBMSG_WAITFORONE\fP (منذ لينكس 2.6.34) يقوم بتشغيل \fBMSG_DONTWAIT\fP بعد استقبال الرسالة الأولى. .P الوسيط \fItimeout\fP يشير إلى \fIstruct timespec\fP (انظر \fBclock_gettime\fP(2)) يحدد مهلة زمنية (ثوانٍ بالإضافة إلى نانوثوانٍ) لعملية الاستقبال (\fIلكن انظر الأخطاء!\fP). (سيتم تقريب هذه الفترة إلى دقة ساعة النظام، وتأخيرات جدولة النواة تعني أن فترة الحظر قد تتجاوز بمقدار صغير.) إذا كان \fItimeout\fP هو NULL، فإن العملية تحظر إلى أجل غير مسمى. .P استدعاء \fBrecvmmsg\fP() المحظور يحظر حتى يتم استقبال \fIn\fP رسالة أو حتى تنتهي المهلة. الاستدعاء غير المحظور يقرأ أكبر عدد ممكن من الرسائل المتاحة (حتى الحد المحدد بواسطة \fIn\fP) ويعود فورًا. .P عند العودة من \fBrecvmmsg\fP()، يتم تحديث العناصر المتتالية من \fImsgvec\fP لتحتوي على معلومات حول كل رسالة مستلمة: \fImsg_len\fP يحتوي على حجم الرسالة المستلمة؛ الحقول الفرعية لـ \fImsg_hdr\fP يتم تحديثها كما هو موصوف في \fBrecvmsg\fP(2). القيمة المعادة للاستدعاء تشير إلى عدد عناصر \fImsgvec\fP التي تم تحديثها. .SH "قيمة الإرجاع" عند النجاح، يعيد \fBrecvmmsg\fP() عدد الرسائل المستلمة في \fImsgvec\fP؛ عند الخطأ، يتم إرجاع \-1، ويتم تعيين \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء الأخطاء هي كما في \fBrecvmsg\fP(2). بالإضافة إلى ذلك، يمكن أن يحدث الخطأ التالي: .TP \fBEINVAL\fP \fItimeout\fP غير صالح. .P انظر أيضًا الأخطاء. .SH المعايير لينكس. .SH التاريخ لينكس 2.6.33، glibc 2.12. .SH العلل .\" FIXME . https://bugzilla.kernel.org/show_bug.cgi?id=75371 .\" http://thread.gmane.org/gmane.linux.man/5677 الوسيط \fItimeout\fP لا يعمل كما هو مقصود. يتم التحقق من المهلة فقط بعد استقبال كل مخطط بيانات، بحيث إذا تم استقبال ما يصل إلى \fIn\-1\fP مخطط بيانات قبل انتهاء المهلة، ولكن بعد ذلك لم يتم استقبال أي مخططات بيانات أخرى، فإن الاستدعاء سيحظر إلى الأبد. .P إذا حدث خطأ بعد استقبال رسالة واحدة على الأقل، فإن الاستدعاء ينجح، ويعيد عدد الرسائل المستلمة. من المتوقع إعادة رمز الخطأ في استدعاء لاحق لـ \fBrecvmmsg\fP(). ومع ذلك، في التنفيذ الحالي، يمكن استبدال رمز الخطأ في هذه الأثناء بواسطة حدث شبكة غير مرتبط على مقبس، على سبيل المثال حزمة ICMP واردة. .SH أمثلة البرنامج التالي يستخدم \fBrecvmmsg\fP() لاستقبال رسائل متعددة على مقبس ويخزنها في مخازن متعددة. يعود الاستدعاء إذا تم ملء جميع المخازن أو إذا انتهت المهلة المحددة. .P المقتطف التالي يولد بشكل دوري مخططات بيانات UDP تحتوي على رقم عشوائي: .P .in +4n .EX $\fB while true; do echo $RANDOM > /dev/udp/127.0.0.1/1234;\fP \fBsleep 0.25; done\fP .EE .in .P تتم قراءة هذه المخططات بواسطة التطبيق المثال، والذي يمكن أن يعطي المخرجات التالية: .P .in +4n .EX $\fB ./a.out\fP 5 messages received 1 11782 2 11345 3 304 4 13514 5 28421 .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (recvmmsg.c) \& .EX #define _GNU_SOURCE #include #include #include #include #include #include #include \& int main(void) { #define VLEN 10 #define BUFSIZE 200 #define TIMEOUT 1 int sockfd, retval; char bufs[VLEN][BUFSIZE+1]; struct iovec iovecs[VLEN]; struct mmsghdr msgs[VLEN]; struct timespec timeout; 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 (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == \-1) { perror("bind()"); exit(EXIT_FAILURE); } \& memset(msgs, 0, sizeof(msgs)); for (size_t i = 0; i < VLEN; i++) { iovecs[i].iov_base = bufs[i]; iovecs[i].iov_len = BUFSIZE; msgs[i].msg_hdr.msg_iov = &iovecs[i]; msgs[i].msg_hdr.msg_iovlen = 1; } \& timeout.tv_sec = TIMEOUT; timeout.tv_nsec = 0; \& retval = recvmmsg(sockfd, msgs, VLEN, 0, &timeout); if (retval == \-1) { perror("recvmmsg()"); exit(EXIT_FAILURE); } \& printf("%d messages received\[rs]n", retval); for (size_t i = 0; i < retval; i++) { bufs[i][msgs[i].msg_len] = 0; printf("%zu %s", i+1, bufs[i]); } exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBclock_gettime\fP(2), \fBrecvmsg\fP(2), \fBsendmmsg\fP(2), \fBsendmsg\fP(2), \fBsocket\fP(2), \fBsocket\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .