Scroll to navigation

rpc(3) Library Functions Manual rpc(3)

الاسم

rpc - دوال المكتبة لاستدعاءات الإجراءات عن بُعد

المكتبة

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

الملخص والوصف

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

لاستخدام هذه الدوال، ضمّن ملف الرأس <rpc/rpc.h>.

تستخدم النماذج الأولية أدناه الأنواع التالية:

typedef int bool_t;
typedef typeof(bool_t (XDR *, void *, ...))  *xdrproc_t;
typedef typeof(bool_t (caddr_t resp, struct sockaddr_in *raddr)
    *resultproc_t;

انظر ملفات الرأس لتصريحات الأنواع AUTH و CLIENT و SVCXPRT و XDR.

void auth_destroy(AUTH *auth);
ماكرو يُدمر معلومات الاستيثاق المرتبطة بـ auth. يتضمن التدمير عادةً تحرير هياكل البيانات الخاصة. استخدام auth غير محدد بعد استدعاء auth_destroy().

AUTH *authnone_create(void);
تنشئ وتُعيد مقبض استيثاق RPC يمرر معلومات استيثاق غير قابلة للاستخدام مع كل استدعاء إجراء عن بُعد. هذا هو الاستيثاق المبدئي المستخدم بواسطة RPC.

AUTH *authunix_create(char *host, uid_t uid, gid_t gid,
                      int n, gid_t aup_gids[n]);
تنشئ وتُعيد مقبض استيثاق RPC يحتوي على معلومات استيثاق. المعامل host هو اسم الجهاز الذي أُنشئت عليه المعلومات؛ uid هو معرف المستخدم؛ gid هو معرف المجموعة الحالي للمستخدم؛ n و aup_gids يشيران إلى مصفوفة معدودة من المجموعات التي ينتمي إليها المستخدم. من السهل انتحال شخصية مستخدم.

AUTH *authunix_create_default(void);
تستدعي authunix_create() مع المعاملات المناسبة.

int callrpc(char *host, unsigned long prognum,
            unsigned long versnum, unsigned long procnum,
            xdrproc_t inproc, const char *in,
            xdrproc_t outproc, char *out);
استدعِ الإجراء عن بُعد المرتبط بـ prognum و versnum و procnum على الجهاز host. المعامل in هو عنوان وسيطات الإجراء، و out هو عنوان مكان وضع النتائج؛ يُستخدم inproc لترميز معاملات الإجراء، ويُستخدم outproc لفك ترميز نتائج الإجراء. يُعيد هذا الروتين صفرًا إذا نجح، أو قيمة enum clnt_stat محولة إلى عدد صحيح إذا فشل. الروتين clnt_perrno() مفيد لترجمة حالات الفشل إلى رسائل.
تحذير: استدعاء الإجراءات عن بُعد بهذا الروتين يستخدم UDP/IP كناقل؛ انظر clntudp_create() للقيود. ليس لديك تحكم في المهلات أو الاستيثاق باستخدام هذا الروتين.

enum clnt_stat clnt_broadcast(unsigned long prognum,
                     unsigned long versnum, unsigned long procnum,
                     xdrproc_t inproc, char *in,
                     xdrproc_t outproc, char *out,
                     resultproc_t eachresult);
مثل callrpc()، باستثناء أن رسالة الاستدعاء تُبث إلى جميع شبكات البث المتصلة محليًا. في كل مرة يستلم فيها استجابة، يستدعي هذا الروتين eachresult()، الذي شكله:

eachresult(char *out, struct sockaddr_in *addr);
    

حيث out هو نفس out المُمرَّر إلى clnt_broadcast()، باستثناء أن مخرجات الإجراء البعيد تُفك ترميزها هناك؛ addr يُشير إلى عنوان الآلة التي أرسلت النتائج. إذا أعادت eachresult() صفرًا، تنتظر clnt_broadcast() ردودًا إضافية؛ وإلا فإنها تعود بحالة مناسبة.
تحذير: مقابس البث محدودة الحجم بأقصى وحدة نقل لرابط البيانات. للإيثرنت، هذه القيمة هي 1500 بايت.

enum clnt_stat clnt_call(CLIENT *clnt, unsigned long procnum,
                    xdrproc_t inproc, char *in,
                    xdrproc_t outproc, char *out,
                    struct timeval tout);
كليّة تستدعي الإجراء البعيد procnum المرتبط بمقبض العميل clnt، الذي يُحصل عليه بإجراء إنشاء عميل RPC مثل clnt_create(). المعامل in هو عنوان وسيط (وسائط) الإجراء، وout هو عنوان مكان وضع النتيجة (النتائج)؛ يُستخدم inproc لترميز معاملات الإجراء، ويُستخدم outproc لفك ترميز نتائج الإجراء؛ tout هو الوقت المسموح به لعودة النتائج.

clnt_destroy(CLIENT *clnt);
كليّة تُدمر مقبض RPC للعميل. يتضمن التدمير عادةً تحرير هياكل بيانات خاصة، بما في ذلك clnt نفسه. استخدام clnt غير مُحدد بعد استدعاء clnt_destroy(). إذا فتحت مكتبة RPC المقبس المرتبط، فإنها تُغلقه أيضًا. وإلا، يبقى المقبس مفتوحًا.

CLIENT *clnt_create(const char *host, unsigned long prog,
                    unsigned long vers, const char *proto);
إجراء إنشاء عميل عام. يُعرِّف host اسم المضيف البعيد حيث يوجد الخادم. يُشير proto إلى نوع بروتوكول النقل المراد استخدامه. القيم المدعومة حاليًا لهذا الحقل هي “udp” و“tcp”. تُضبط مهلات مبدئية، ولكن يمكن تعديلها باستخدام clnt_control().
تحذير: استخدام UDP له عيوبه. نظرًا لأن رسائل RPC القائمة على UDP يمكنها حمل ما يصل إلى 8 كيلوبايت فقط من البيانات المُرمَّزة، لا يمكن استخدام هذا النقل للإجراءات التي تأخذ وسائط كبيرة أو تُرجع نتائج ضخمة.

bool_t clnt_control(CLIENT *cl, int req, char *info);
كليّة تُستخدم لتغيير أو استرجاع معلومات متنوعة حول كائن عميل. يُشير req إلى نوع العملية، وinfo هو مؤشر للمعلومات. لكل من UDP وTCP، القيم المدعومة لـ req وأنواع وسائطها وما تفعله هي:

CLSET_TIMEOUT  struct timeval // تعيين على مجموعة المهل
CLGET_TIMEOUT  struct timeval // الحصول  مجموعة المهل
    

ملاحظة: إذا ضبطت المهلة باستخدام clnt_control()، فإن معامل المهلة المُمرَّر إلى clnt_call() سيُتجاهل في جميع الاستدعاءات المستقبلية.

CLGET_SERVER_ADDR  struct sockaddr_in

// get server's address

العمليات التالية صالحة لـ UDP فقط:

CLSET_RETRY_TIMEOUT  struct timeval // set the retry timeout
CLGET_RETRY_TIMEOUT  struct timeval // get the retry timeout
    

مهلة إعادة المحاولة هي الوقت الذي ينتظره "UDP RPC" رد الخادم قبل إعادة إرسال الطلب.

clnt_freeres(CLIENT * clnt, xdrproc_t outproc, char *out);
كليّة تُحرر أي بيانات خصصها نظام RPC/XDR عندما فك ترميز نتائج استدعاء RPC. المعامل out هو عنوان النتائج، وoutproc هو إجراء XDR الذي يصف النتائج. يُرجع هذا الإجراء واحدًا إذا حُررت النتائج بنجاح، وصفرًا بخلاف ذلك.

void clnt_geterr(CLIENT *clnt, struct rpc_err *errp);
وِحدةٌ ماكرو تنسخ بنية الخطأ من مقبض العميل إلى البنية الموجودة في العنوان errp.

void clnt_pcreateerror(const char *s);
اطبع رسالة إلى الخطأ المعياري توضح سبب عدم إنشاء مقبض عميل RPC. تُسبق الرسالة بسلسلة المحارف s ونقطتين رأسيتين. تُستخدم عندما تفشل استدعاءات clnt_create() أو clntraw_create() أو clnttcp_create() أو clntudp_create().

void clnt_perrno(enum clnt_stat stat);
اطبع رسالة إلى الخطأ المعياري تتوافق مع الحالة المشار إليها بواسطة stat. تُستخدم بعد callrpc().

clnt_perror(CLIENT *clnt, const char *s);
اطبع رسالة إلى الخطأ المعياري توضح سبب فشل استدعاء RPC؛ clnt هو المقبض المستخدم لإجراء الاستدعاء. تُسبق الرسالة بسلسلة المحارف s ونقطتين رأسيتين. تُستخدم بعد clnt_call().

char *clnt_spcreateerror(const char *s);
مثل clnt_pcreateerror()، باستثناء أنها تُرجع سلسلة محارف بدلاً من الطباعة إلى الخطأ المعياري.
أخطاء: تُرجع مؤشرًا إلى بيانات ثابتة يُستبدل في كل استدعاء.

char *clnt_sperrno(enum clnt_stat stat);
تأخذ نفس المعاملات مثل clnt_perrno()، ولكن بدلاً من إرسال رسالة إلى الخطأ المعياري توضح سبب فشل استدعاء RPC، تُرجع مؤشرًا إلى سلسلة محارف تحتوي على الرسالة. تنتهي السلسلة بحرف سطر جديد.
تُستخدم clnt_sperrno() بدلاً من clnt_perrno() إذا لم يكن للبرنامج خطأ معياري (كما هو الحال غالبًا مع برنامج يعمل كخادم)، أو إذا لم يرغب المبرمج في إخراج الرسالة باستخدام printf(3)، أو إذا كان سيُستخدم تنسيق رسالة مختلف عن ذلك الذي تدعمه clnt_perrno(). ملاحظة: على عكس clnt_sperror() وclnt_spcreateerror()، تُرجع clnt_sperrno() مؤشرًا إلى بيانات ثابتة، ولكن النتيجة لن تُستبدل في كل استدعاء.

char *clnt_sperror(CLIENT *rpch, const char *s);
مثل clnt_perror()، باستثناء أنها (مثل clnt_sperrno()) تُرجع سلسلة محارف بدلاً من الطباعة إلى الخطأ المعياري.
أخطاء: تُرجع مؤشرًا إلى بيانات ثابتة يُستبدل في كل استدعاء.

CLIENT *clntraw_create(unsigned long prognum, unsigned long versnum);
تنشئ هذه الدالة عميل RPC تجريبيًا للبرنامج البعيد prognum، الإصدار versnum. وسيلة النقل المستخدمة لتمرير الرسائل إلى الخدمة هي في الواقع مخزن مؤقت داخل مساحة عنوان العملية، لذا يجب أن يعيش خادم RPC المقابل في نفس مساحة العنوان؛ انظر svcraw_create(). يسمح هذا بمحاكاة RPC والحصول على تكاليف RPC، مثل أوقات الرحلة ذهابًا وإيابًا، دون أي تدخل من النواة. تُرجع هذه الدالة NULL إذا فشلت.

CLIENT *clnttcp_create(struct sockaddr_in *addr,
                unsigned long prognum, unsigned long versnum,
                int *sockp, unsigned int sendsz, unsigned int recvsz);
تنشئ هذه الدالة عميل RPC للبرنامج البعيد prognum، الإصدار versnum؛ يستخدم العميل TCP/IP كوسيلة نقل. يقع البرنامج البعيد في عنوان الإنترنت *addr. إذا كان addr->sin_port صفرًا، فإنه يُضبط على المنفذ الفعلي الذي يستمع عليه البرنامج البعيد (يُستشار خدمة portmap البعيدة لهذه المعلومات). المعامل sockp هو مقبس؛ إذا كان RPC_ANYSOCK، فإن هذه الدالة تفتح مقبسًا جديدًا وتضبط sockp. نظرًا لأن RPC القائم على TCP يستخدم الإدخال/الإخراج المُخزَّن، يمكن للمستخدم تحديد حجم المخازن المؤقتة للإرسال والاستقبال باستخدام المعاملين sendsz وrecvsz؛ القيم الصفرية تختار مبدئيًا قيمًا مناسبة. تُرجع هذه الدالة NULL إذا فشلت.

CLIENT *clntudp_create(struct sockaddr_in *addr,
                unsigned long prognum, unsigned long versnum,
                struct timeval wait, int *sockp);
تنشئ هذه الروتين عميل RPC للبرنامج البعيد prognum، الإصدار versnum؛ يستخدم العميل UDP/IP كوسيلة نقل. يقع البرنامج البعيد على عنوان الإنترنت addr. إذا كان addr->sin_port صفرًا، فسيُضبط على المنفذ الفعلي الذي يستمع عليه البرنامج البعيد (يُستشار خدمة portmap البعيدة لهذه المعلومة). المعامل sockp هو مقبس؛ إذا كان RPC_ANYSOCK، فإن هذا الروتين يفتح مقبسًا جديدًا ويضبط sockp. يعيد نقل UDP إرسال رسالة الاستدعاء على فترات زمنية wait حتى تُستلم استجابة أو حتى ينتهي وقت الاستدعاء. يُحدد الوقت الإجمالي لانتهاء وقت الاستدعاء بواسطة clnt_call().
تحذير: نظرًا لأن رسائل RPC القائمة على UDP يمكنها حمل ما يصل إلى 8 كيلوبايت فقط من البيانات المُرمَّزة، فلا يمكن استخدام وسيلة النقل هذه للإجراءات التي تأخذ وسائط كبيرة أو تُرجع نتائج ضخمة.

CLIENT *clntudp_bufcreate(struct sockaddr_in *addr,
            unsigned long prognum, unsigned long versnum,
            struct timeval wait, int *sockp,
            unsigned int sendsize, unsigned int recosize);
تنشئ هذه الروتين عميل RPC للبرنامج البعيد prognum، على versnum؛ يستخدم العميل UDP/IP كوسيلة نقل. يقع البرنامج البعيد على عنوان الإنترنت addr. إذا كان addr->sin_port صفرًا، فسيُضبط على المنفذ الفعلي الذي يستمع عليه البرنامج البعيد (يُستشار خدمة portmap البعيدة لهذه المعلومة). المعامل sockp هو مقبس؛ إذا كان RPC_ANYSOCK، فإن هذا الروتين يفتح مقبسًا جديدًا ويضبط sockp. يعيد نقل UDP إرسال رسالة الاستدعاء على فترات زمنية wait حتى تُستلم استجابة أو حتى ينتهي وقت الاستدعاء. يُحدد الوقت الإجمالي لانتهاء وقت الاستدعاء بواسطة clnt_call().
يسمح هذا للمستخدم بتحديد الحجم الأقصى للحزمة لإرسال واستقبال رسائل RPC القائمة على UDP.

void get_myaddress(struct sockaddr_in *addr);
يُدخل عنوان IP للجهاز في *addr، دون استشارة دوال المكتبة التي تتعامل مع /etc/hosts. يُضبط رقم المنفذ دائمًا على htons(PMAPPORT).

struct pmaplist *pmap_getmaps(struct sockaddr_in *addr);
واجهة مستخدم لخدمة portmap، تُرجع قائمة بتعيينات برنامج RPC الحالية إلى المنفذ على المضيف الواقع على عنوان IP *addr. يمكن لهذا الروتين إرجاع NULL. يستخدم الأمر rpcinfo -p هذا الروتين.

unsigned short pmap_getport(struct sockaddr_in *addr,
                    unsigned long prognum, unsigned long versnum,
                    unsigned int protocol);
واجهة مستخدم لخدمة portmap، تُرجع رقم المنفذ الذي ينتظر عليه خدمة تدعم رقم البرنامج prognum، الإصدار versnum، وتتحدث بروتوكول النقل المرتبط بـ protocol. من المرجح أن تكون قيمة protocol هي IPPROTO_UDP أو IPPROTO_TCP. تعني قيمة الإرجاع صفر أن التعيين غير موجود أو أن نظام RPC فشل في الاتصال بخدمة portmap البعيدة. في الحالة الأخيرة، يحتوي المتغير العام rpc_createerr على حالة RPC.

enum clnt_stat pmap_rmtcall(struct sockaddr_in *addr,
                    unsigned long prognum, unsigned long versnum,
                    unsigned long procnum,
                    xdrproc_t inproc, char *in,
                    xdrproc_t outproc, char *out,
                    struct timeval tout, unsigned long *portp);
واجهة مستخدم لخدمة portmap، تُوجّه portmap على المضيف الواقع على عنوان IP *addr لإجراء استدعاء RPC نيابة عنك إلى إجراء على ذلك المضيف. سيُعدّل المعامل *portp إلى رقم منفذ البرنامج إذا نجح الإجراء. تُناقش تعريفات المعاملات الأخرى في callrpc() و clnt_call(). يجب استخدام هذا الإجراء لـ “ping” فقط ولا شيء غيره. انظر أيضًا clnt_broadcast().

bool_t pmap_set(unsigned long prognum, unsigned long versnum,
                int protocol, unsigned short port);
واجهة مستخدم لخدمة portmap، تُنشئ تعيينًا بين الثلاثي [prognum,versnum,protocol] و port على خدمة portmap للجهاز. من المرجح أن تكون قيمة protocol هي IPPROTO_UDP أو IPPROTO_TCP. يُرجع هذا الروتين واحدًا إذا نجح، صفرًا بخلاف ذلك. يُنجز آليًا بواسطة svc_register().

bool_t pmap_unset(unsigned long prognum, unsigned long versnum);
واجهة مستخدم لخدمة portmap، تُدمر جميع التعيينات بين الثلاثي [prognum,versnum,*] و ports على خدمة portmap للجهاز. يُرجع هذا الروتين واحدًا إذا نجح، صفرًا بخلاف ذلك.

int registerrpc(unsigned long prognum, unsigned long versnum,
                unsigned long procnum, typeof(char *(char *)) *procname,
                xdrproc_t inproc, xdrproc_t outproc);
يسجّل الإجراء procname مع حزمة خدمة RPC. إذا وصل طلب للبرنامج prognum، الإصدار versnum، والإجراء procnum، يُستدعى procname بمؤشر إلى معاملاته (معاملاته)؛ يجب أن يُرجع procname مؤشرًا إلى نتائجه الثابتة (نتائجه)؛ يُستخدم inproc لفك ترميز المعاملات بينما يُستخدم outproc لترميز النتائج. يُرجع هذا الروتين صفرًا إذا نجح التسجيل، -1 بخلاف ذلك.
تحذير: تُوصل الإجراءات البعيدة المسجلة بهذا الشكل باستخدام وسيلة نقل UDP/IP؛ انظر svcudp_create() للقيود.

struct rpc_createerr rpc_createerr;
متغير عام تُعيَّن قيمته بواسطة أي روتين إنشاء عميل RPC لا ينجح. استخدم الروتين clnt_pcreateerror() لطباعة سبب الفشل.

void svc_destroy(SVCXPRT *xprt);
كليّة تُدمّر مقبض نقل خدمة RPC، xprt. يتضمن التدمير عادةً تحرير بنى البيانات الخاصة، بما في ذلك xprt نفسه. استخدام xprt غير مُعرَّف بعد استدعاء هذا الروتين.

fd_set svc_fdset;
متغير عام يعكس قناع بت واصف الملف للقراءة من جانب خدمة RPC؛ وهو مناسب كمعامل لاستدعاء النظام select(2). يهم هذا فقط إذا كان مُنفِّذ الخدمة يعالج الأحداث غير المتزامنة بنفسه، بدلاً من استدعاء svc_run(). هذا المتغير للقراءة فقط (لا تمرّر عنوانه إلى select(2)!)، لكنه قد يتغير بعد استدعاءات svc_getreqset() أو أي روتينات إنشاء.

int svc_fds;
مشابه لـ svc_fdset، لكنه محدود بـ 32 واصف ملف. هذه الواجهة أُهملت لصالح svc_fdset.

svc_freeargs(SVCXPRT *xprt, xdrproc_t inproc, char *in);
كليّة تُحرّر أي بيانات خصّصها نظام RPC/XDR عندما فكّك الوسائط لإجراء خدمة باستخدام svc_getargs(). يُعيد هذا الروتين 1 إذا حُرّرت النتائج بنجاح، وصفرًا بخلاف ذلك.

svc_getargs(SVCXPRT *xprt, xdrproc_t inproc, char *in);
كليّة تفكّ وسائط طلب RPC المرتبط بمقبض نقل خدمة RPC، xprt. المعامل in هو العنوان الذي ستوضع فيه الوسائط؛ inproc هو روتين XDR المستخدم لفك الوسائط. يُعيد هذا الروتين واحدًا إذا نجح الفك، وصفرًا بخلاف ذلك.

struct sockaddr_in *svc_getcaller(SVCXPRT *xprt);
الطريقة المعتمدة للحصول على عنوان الشبكة للمُستدعي لإجراء مرتبط بمقبض نقل خدمة RPC، xprt.

void svc_getreqset(fd_set *rdfds);
يهتم بهذا الروتين فقط إذا كان مُنفِّذ الخدمة لا يستدعي svc_run()، بل يُنفّذ معالجة أحداث غير متزامنة مخصصة. يُستدعى عندما يُحدد استدعاء النظام select(2) أن طلب RPC قد وصل على بعض مقابس RPC؛ rdfds هو قناع بت واصف الملف للقراءة الناتج. يُعيد الروتين عندما تُخدم جميع المقابس المرتبطة بقيمة rdfds.

void svc_getreq(int rdfds);
مشابه لـ svc_getreqset()، لكنه محدود بـ 32 واصف ملف. هذه الواجهة أُهملت لصالح svc_getreqset().

bool_t svc_register(SVCXPRT *xprt, unsigned long prognum,
                    unsigned long versnum,
                    typeof(void (struct svc_req *, SVCXPRT *)) *dispatch,
                    unsigned long protocol);
يربط prognum و versnum بإجراء التوزيع للخدمة، dispatch. إذا كان protocol صفرًا، لا تُسجَّل الخدمة مع خدمة portmap. إذا كان protocol غير صفري، يُنشأ تعيين الثلاثي [prognum,versnum,protocol] إلى xprt->xp_port مع خدمة portmap المحلية (عمومًا protocol هو صفر، IPPROTO_UDP أو IPPROTO_TCP). للإجراء dispatch الشكل التالي:

dispatch(struct svc_req *request, SVCXPRT *xprt);
    

الدالة svc_register() تُرجع واحدًا إذا نجحت، وصفرًا بخلاف ذلك.

void svc_run(void);
هذه الدالة لا تعود أبدًا. تنتظر وصول طلبات RPC، وتستدعي إجراء الخدمة المناسب باستخدام svc_getreq() عند وصول أحدها. عادةً ما تنتظر هذه الدالة عودة استدعاء نظام select(2).

bool_t svc_sendreply(SVCXPRT *xprt, xdrproc_t outproc, char *out);
تُستدعى بواسطة دالة توزيع خدمة RPC لإرسال نتائج استدعاء إجراء عن بُعد. المعامل xprt هو مقبض النقل المرتبط بالطلب؛ outproc هي دالة XDR المستخدمة لترميز النتائج؛ وout هو عنوان النتائج. تُرجع هذه الدالة واحدًا إذا نجحت، صفرًا بخلاف ذلك.

void svc_unregister(unsigned long prognum, unsigned long versnum);
أزل كل تعيين للزوج [prognum,versnum] إلى دوال التوزيع، وللثلاثي [prognum,versnum,*] إلى رقم المنفذ.

void svcerr_auth(SVCXPRT *xprt, enum auth_stat why);
تُستدعى بواسطة دالة توزيع خدمة ترفض تنفيذ استدعاء إجراء عن بُعد بسبب خطأ في الاستيثاق.

void svcerr_decode(SVCXPRT *xprt);
تُستدعى بواسطة دالة توزيع خدمة لا تستطيع فك ترميز معاملاتها بنجاح. انظر أيضًا svc_getargs().

void svcerr_noproc(SVCXPRT *xprt);
تُستدعى بواسطة دالة توزيع خدمة لا تنفذ رقم الإجراء الذي يطلبه المستدعي.

void svcerr_noprog(SVCXPRT *xprt);
تُستدعى عندما لا يكون البرنامج المطلوب مسجلاً في حزمة RPC. عادةً لا يحتاج منفذو الخدمة إلى هذه الدالة.

void svcerr_progvers(SVCXPRT *xprt, unsigned long low_vers,
                     unsigned long high_vers);
تُستدعى عندما لا يكون الإصدار المطلوب من برنامج مسجلاً في حزمة RPC. عادةً لا يحتاج منفذو الخدمة إلى هذه الدالة.

void svcerr_systemerr(SVCXPRT *xprt);
تُستدعى بواسطة دالة توزيع خدمة عندما تكتشف خطأ نظاميًا لا يشمله أي بروتوكول معين. على سبيل المثال، إذا لم تعد الخدمة قادرة على تخصيص تخزين، فقد تستدعي هذه الدالة.

void svcerr_weakauth(SVCXPRT *xprt);
تُستدعى بواسطة روتين توزيع الخدمة الذي يرفض تنفيذ استدعاء إجراء بعيد بسبب معاملات استيثاق غير كافية. يستدعي الروتين svcerr_auth(xprt, AUTH_TOOWEAK).

SVCXPRT *svcfd_create(int fd, unsigned int sendsize,
                      unsigned int recvsize);
ينشئ خدمة فوق أي واصف ملف مفتوح. عادةً، يكون واصف الملف هذا مقبسًا موصولًا لبروتوكول دفق مثل TCP. يُشير sendsize و recvsize إلى أحجام المخازن المؤقتة للإرسال والاستقبال. إذا كانت صفرًا، يُختار مبدئي معقول.

SVCXPRT *svcraw_create(void);
ينشئ هذا الروتين ناقل خدمة RPC تجريبي، ويعيد مؤشرًا إليه. الناقل هو في الواقع خبيئة داخل مساحة عنوان العملية، لذا يجب أن يعيش عميل RPC المقابل في نفس مساحة العنوان؛ انظر clntraw_create(). يسمح هذا الروتين بمحاكاة RPC واكتساب أعباء RPC (مثل أوقات الرحلة ذهابًا وإيابًا)، دون أي تدخل من النواة. يُعيد هذا الروتين NULL إذا فشل.

SVCXPRT *svctcp_create(int sock, unsigned int send_buf_size,
                       unsigned int recv_buf_size);
ينشئ هذا الروتين ناقل خدمة RPC قائم على TCP/IP، ويعيد مؤشرًا إليه. يُربط الناقل بالمقبس sock، الذي قد يكون RPC_ANYSOCK، وفي هذه الحالة يُنشأ مقبس جديد. إذا لم يكن المقبس مربوطًا بمنفذ TCP محلي، فإن هذا الروتين يربطه بمنفذ عشوائي. عند الإكمال، xprt->xp_sock هو واصف مقبس الناقل، و xprt->xp_port هو رقم منفذ الناقل. يُعيد هذا الروتين NULL إذا فشل. نظرًا لأن RPC القائم على TCP يستخدم الإدخال/الإخراج المُخزَّن، يمكن للمستخدمين تحديد حجم المخازن المؤقتة؛ القيم الصفرية تختار مبدئيات مناسبة.

SVCXPRT *svcudp_bufcreate(int sock, unsigned int sendsize,
                          unsigned int recosize);
ينشئ هذا الروتين ناقل خدمة RPC قائم على UDP/IP، ويعيد مؤشرًا إليه. يُربط الناقل بالمقبس sock، الذي قد يكون RPC_ANYSOCK، وفي هذه الحالة يُنشأ مقبس جديد. إذا لم يكن المقبس مربوطًا بمنفذ UDP محلي، فإن هذا الروتين يربطه بمنفذ عشوائي. عند الإكمال، xprt->xp_sock هو واصف مقبس الناقل، و xprt->xp_port هو رقم منفذ الناقل. يُعيد هذا الروتين NULL إذا فشل.
يسمح هذا للمستخدم بتحديد الحجم الأقصى للحزمة لإرسال واستقبال رسائل RPC القائمة على UDP.

SVCXPRT *svcudp_create(int sock);
هذا الاستدعاء مكافئ لـ svcudp_bufcreate(sock,SZ,SZ) لحجم مبدئي ما SZ.

bool_t xdr_accepted_reply(XDR *xdrs, struct accepted_reply *ar);
تُستخدم لترميز رسائل رد RPC. هذا الروتين مفيد للمستخدمين الذين يرغبون في توليد رسائل بنمط RPC دون استخدام حزمة RPC.

bool_t xdr_authunix_parms(XDR *xdrs, struct authunix_parms *aupp);
تُستخدم لوصف بيانات اعتماد UNIX. هذا الروتين مفيد للمستخدمين الذين يرغبون في توليد بيانات الاعتماد هذه دون استخدام حزمة استيثاق RPC.

void xdr_callhdr(XDR *xdrs, struct rpc_msg *chdr);
تُستخدم لوصف رسائل رأس استدعاء RPC. هذا الروتين مفيد للمستخدمين الذين يرغبون في توليد رسائل بنمط RPC دون استخدام حزمة RPC.

bool_t xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg);
تُستخدم لوصف رسائل استدعاء RPC. هذا الروتين مفيد للمستخدمين الذين يرغبون في توليد رسائل بنمط RPC دون استخدام حزمة RPC.

bool_t xdr_opaque_auth(XDR *xdrs, struct opaque_auth *ap);
تُستخدم لوصف رسائل معلومات الاستيثاق في RPC. هذه الدالة مفيدة للمستخدمين الذين يرغبون في توليد رسائل بأسلوب RPC دون استخدام حزمة RPC.

bool_t xdr_pmap(XDR *xdrs, struct pmap *regs);
تُستخدم لوصف المعاملات لإجراءات portmap المختلفة، خارجيًا. هذه الدالة مفيدة للمستخدمين الذين يرغبون في توليد هذه المعاملات دون استخدام واجهة pmap.

bool_t xdr_pmaplist(XDR *xdrs, struct pmaplist **rp);
تُستخدم لوصف قائمة من تعيينات المنافذ، خارجيًا. هذه الدالة مفيدة للمستخدمين الذين يرغبون في توليد هذه المعاملات دون استخدام واجهة pmap.

bool_t xdr_rejected_reply(XDR *xdrs, struct rejected_reply *rr);
تُستخدم لوصف رسائل الرد في RPC. هذه الدالة مفيدة للمستخدمين الذين يرغبون في توليد رسائل بأسلوب RPC دون استخدام حزمة RPC.

bool_t xdr_replymsg(XDR *xdrs, struct rpc_msg *rmsg);
تُستخدم لوصف رسائل الرد في RPC. هذه الدالة مفيدة للمستخدمين الذين يرغبون في توليد رسائل بأسلوب RPC دون استخدام حزمة RPC.

void xprt_register(SVCXPRT *xprt);
بعد إنشاء مقابض نقل خدمة RPC، يجب عليها تسجيل نفسها لدي حزمة خدمة RPC. هذه الدالة تُعدل المتغير العام svc_fds. منفذو الخدمة عادة لا يحتاجون هذه الدالة.

void xprt_unregister(SVCXPRT *xprt);
قبل إتلاف مقبض نقل خدمة RPC، يجب عليه إلغاء تسجيل نفسه لدي حزمة خدمة RPC. هذه الدالة تُعدل المتغير العام svc_fds. منفذو الخدمة عادة لا يحتاجون هذه الدالة.

السمات

للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).

الواجهة السمة القيمة
auth_destroy()، authnone_create()، authunix_create()، authunix_create_default()، callrpc()، clnt_broadcast()، clnt_call()، clnt_destroy()، clnt_create()، clnt_control()، clnt_freeres()، clnt_geterr()، clnt_pcreateerror()، clnt_perrno()، clnt_perror()، clnt_spcreateerror()، clnt_sperrno()، clnt_sperror()، clntraw_create()، clnttcp_create()، clntudp_create()، clntudp_bufcreate()، get_myaddress()، pmap_getmaps()، pmap_getport()، pmap_rmtcall()، pmap_set()، pmap_unset()، registerrpc()، svc_destroy()، svc_freeargs()، svc_getargs()، svc_getcaller()، svc_getreqset()، svc_getreq()، svc_register()، svc_run()، svc_sendreply()، svc_unregister()، svcerr_auth()، svcerr_decode()، svcerr_noproc()، svcerr_noprog()، svcerr_progvers()، svcerr_systemerr()، svcerr_weakauth()، svcfd_create()، svcraw_create()، svctcp_create()، svcudp_bufcreate()، svcudp_create()، xdr_accepted_reply()، xdr_authunix_parms()، xdr_callhdr()، xdr_callmsg()، xdr_opaque_auth()، xdr_pmap()، xdr_pmaplist()، xdr_rejected_reply()، xdr_replymsg()، xprt_register()، xprt_unregister() سلامة الخيوط MT-Safe

انظر أيضًا

xdr(3)

كتيبات الأدلة التالية:

استدعاءات الإجراءات عن بُعد: مواصفات البروتوكول
دليل برمجة استدعاءات الإجراءات عن بُعد
دليل برمجة rpcgen

RPC: مواصفات بروتوكول استدعاء الإجراءات عن بُعد، RFC 1050، شركة Sun Microsystems، USC-ISI.

ترجمة

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

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

21 سبتمبر 2025 صفحات دليل لينكس 6.18