تسمح هذه
الدوال
لبرامج 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.
منفذو
الخدمة
عادة لا
يحتاجون
هذه
الدالة.