.\" -*- coding: UTF-8 -*- .\" Copyright 1999, Andi Kleen .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-1-para .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH CMSG 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم CMSG_ALIGN و CMSG_SPACE و CMSG_NXTHDR و CMSG_FIRSTHDR \- الوصول إلى البيانات المساعدة (ancillary data) .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBstruct cmsghdr *CMSG_FIRSTHDR(struct msghdr *\fP\fImsgh\fP\fB);\fP \fBstruct cmsghdr *CMSG_NXTHDR(struct msghdr *\fP\fImsgh\fP\fB,\fP \fB struct cmsghdr *\fPcmsg\fB);\fP \fBsize_t CMSG_ALIGN(size_t \fP\fIlength\fP\fB);\fP \fBsize_t CMSG_SPACE(size_t \fP\fIlength\fP\fB);\fP \fBsize_t CMSG_LEN(size_t \fP\fIlength\fP\fB);\fP \fBunsigned char *CMSG_DATA(struct cmsghdr *\fP\fIcmsg\fP\fB);\fP .fi .SH الوصف تُستخدم هذه الكليّات لإنشاء والوصول إلى رسائل التحكم (وتسمى أيضًا البيانات المساعدة) التي ليست جزءًا من حمولة المقبس. قد تتضمن معلومات التحكم هذه الواجهة التي استُلمت عليها الحزمة، وحقول رأس متنوعة نادرة الاستخدام، ووصف خطأ موسع، ومجموعة من واصفات الملفات، أو بيانات اعتماد UNIX. على سبيل المثال، يمكن استخدام رسائل التحكم لإرسال حقول رأس إضافية مثل خيارات IP. تُرسل البيانات المساعدة باستدعاء \fBsendmsg\fP(2) وتُستلم باستدعاء \fBrecvmsg\fP(2). راجع صفحات الدليل الخاصة بهما لمزيد من المعلومات. .P البيانات المساعدة هي سلسلة من بنى \fIcmsghdr\fP مع بيانات ملحقة. راجع صفحات دليل البروتوكول المحدد لأنواع رسائل التحكم المتاحة. يمكن ضبط الحجم الأقصى للمخزن المؤقت المساعد المسموح به لكل مقبس باستخدام \fI/proc/sys/net/core/optmem_max\fP؛ انظر \fBsocket\fP(7). .P تُعرّف بنية \fIcmsghdr\fP كالتالي: .P .in +4n .EX struct cmsghdr { size_t cmsg_len; /* Data byte count, including header (type is socklen_t in POSIX) */ int cmsg_level; /* Originating protocol */ int cmsg_type; /* Protocol\-specific type */ /* followed by unsigned char cmsg_data[]; */ }; .EE .in .P لا ينبغي أبدًا الوصول إلى سلسلة بنى \fIcmsghdr\fP مباشرة. بدلاً من ذلك، استخدم فقط الكليّات التالية: .TP \fBCMSG_FIRSTHDR\fP() تُرجع مؤشرًا إلى أول \fIcmsghdr\fP في المخزن المؤقت للبيانات المساعدة المرتبط بـ \fImsghdr\fP المُمرر. تُرجع NULL إذا لم تكن هناك مساحة كافية لـ \fIcmsghdr\fP في المخزن. .TP \fBCMSG_NXTHDR\fP() تُرجع \fIcmsghdr\fP الصحيح التالي بعد \fIcmsghdr\fP المُمرر. تُرجع NULL عندما لا توجد مساحة كافية متبقية في المخزن. .IP عند تهيئة مخزن سيحتوي على سلسلة من بنى \fIcmsghdr\fP (مثلًا، لإرسالها مع \fBsendmsg\fP(2))، يجب أولاً تهيئة ذلك المخزن بالأصفار لضمان التشغيل الصحيح لـ \fBCMSG_NXTHDR\fP(). .TP \fBCMSG_ALIGN\fP()، بإعطائها طولًا، تُرجعه شاملًا المحاذاة المطلوبة. هذا تعبير ثابت. .TP \fBCMSG_SPACE\fP() تُرجع عدد البايتات التي يشغلها عنصر مساعد بحمولة طول البيانات المُمررة. هذا تعبير ثابت. .TP \fBCMSG_DATA\fP() تُرجع مؤشرًا إلى جزء البيانات من \fIcmsghdr\fP. لا يمكن افتراض أن المؤشر المُعاد محاذاته بشكل مناسب للوصول إلى أنواع بيانات حمولة عشوائية. لا ينبغي للتطبيقات تحويله إلى نوع مؤشر يطابق الحمولة، بل يجب بدلاً من ذلك استخدام \fBmemcpy\fP(3) لنسخ البيانات إلى أو من كائن مُصرّح به بشكل مناسب. .TP \fBCMSG_LEN\fP() تُرجع القيمة المراد تخزينها في عضو \fIcmsg_len\fP من بنية \fIcmsghdr\fP، مع مراعاة أي محاذاة ضرورية. تأخذ طول البيانات كوسيطة. هذا تعبير ثابت. .P لإنشاء بيانات مساعدة، يُهيأ أولاً عضو \fImsg_controllen\fP من \fImsghdr\fP بطول مخزن رسالة التحكم. يُستخدم \fBCMSG_FIRSTHDR\fP() على \fImsghdr\fP للحصول على أول رسالة تحكم و \fBCMSG_NXTHDR\fP() للحصول على كل الرسائل اللاحقة. في كل رسالة تحكم، يُهيأ \fIcmsg_len\fP (باستخدام \fBCMSG_LEN\fP())، وحقول رأس \fIcmsghdr\fP الأخرى، وجزء البيانات باستخدام \fBCMSG_DATA\fP(). أخيراً، يُضبط حقل \fImsg_controllen\fP من \fImsghdr\fP ليكون مجموع \fBCMSG_SPACE\fP() لطول كل رسائل التحكم في المخزن. لمزيد من المعلومات حول \fImsghdr\fP، انظر \fBrecvmsg\fP(2). .SH الإصدارات للتوافقية، يجب الوصول إلى البيانات المساعدة باستخدام وحدات الماكرو الموصوفة هنا فقط. .P في لينكس، \fBCMSG_LEN\fP() و \fBCMSG_DATA\fP() و \fBCMSG_ALIGN\fP() هي تعابير ثابتة (بافتراض أن وسيطها ثابت)، مما يعني أن هذه القيم يمكن استخدامها لتعريف حجم متغيرات عامة. لكن هذا قد لا يكون محمولاً. .SH المعايير .TP \fBCMSG_FIRSTHDR\fP() .TQ \fBCMSG_NXTHDR\fP() .TQ \fBCMSG_DATA\fP() POSIX.1\-2008. .TP \fBCMSG_SPACE\fP() .TQ \fBCMSG_LEN\fP() .TQ \fBCMSG_ALIGN\fP() لينكس. .SH التاريخ يتوافق نموذج البيانات المساعدة هذا مع مسودة POSIX.1g و 4.4BSD\-Lite و API المتقدم لـ IPv6 الموصوف في RFC\ 2292 و SUSv2. .P .\" https://www.austingroupbugs.net/view.php?id=978#c3242 سيُدرج \fBCMSG_SPACE\fP() و \fBCMSG_LEN\fP() في الإصدار التالي من POSIX (العدد 8). .SH أمثلة يبحث هذا الكود عن خيار \fBIP_TTL\fP في مخزن مساعد مستلم: .P .in +4n .EX struct msghdr msgh; struct cmsghdr *cmsg; int received_ttl; \& /* Receive auxiliary data in msgh */ \& for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL; cmsg = CMSG_NXTHDR(&msgh, cmsg)) { if (cmsg\->cmsg_level == IPPROTO_IP && cmsg\->cmsg_type == IP_TTL) { memcpy(&receive_ttl, CMSG_DATA(cmsg), sizeof(received_ttl)); break; } } \& if (cmsg == NULL) { /* Error: IP_TTL not enabled or small buffer or I/O error */ } .EE .in .P يمرر الكود أدناه مصفوفة من واصفات الملفات عبر مقبس نطاق UNIX باستخدام \fBSCM_RIGHTS\fP: .P .in +4n .EX struct msghdr msg = { 0 }; struct cmsghdr *cmsg; int myfds[NUM_FD]; /* Contains the file descriptors to pass */ char iobuf[1]; struct iovec io = { .iov_base = iobuf, .iov_len = sizeof(iobuf) }; union { /* Ancillary data buffer, wrapped in a union in order to ensure it is suitably aligned */ char buf[CMSG_SPACE(sizeof(myfds))]; struct cmsghdr align; } u; \& msg.msg_iov = &io; msg.msg_iovlen = 1; msg.msg_control = u.buf; msg.msg_controllen = sizeof(u.buf); cmsg = CMSG_FIRSTHDR(&msg); cmsg\->cmsg_level = SOL_SOCKET; cmsg\->cmsg_type = SCM_RIGHTS; cmsg\->cmsg_len = CMSG_LEN(sizeof(myfds)); memcpy(CMSG_DATA(cmsg), myfds, sizeof(myfds)); .EE .in .P لمثال كود كامل يوضح تمرير واصفات الملفات عبر مقبس نطاق UNIX، انظر \fBseccomp_unotify\fP(2). .SH "انظر أيضًا" \fBrecvmsg\fP(2), \fBsendmsg\fP(2) .P RFC\ 2292 .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .