-
客戶端代碼
#include<stdio.h> #include<rpc/rpc.h> #include<string.h> #include<stdlib.h> #define PROGNUM 12345 #define PROGVER 1 #define PROGPRO 1 #define size 10 char* real_invoke(char *a) { static char b[20]={0}; if( strcmp(a,"hello") == 0) { memcpy(b,"world",6); return b; } else { memcpy(b,"ok",3); return b; } } bool_t decode_encode_free(XDR *a,char *c) { if(XDR_FREE == a->x_op) { return 1; } else { return xdr_wrapstring(a,&c); } } int main() { pmap_unset(PROGNUM, PROGVER); registerrpc(PROGNUM,PROGVER,PROGPRO,real_invoke,decode_encode_free,decode_encode_free); svc_run(); printf("Error:svc_run returned!\n"); }
-
執行順序
-
函數原型
int registerrpc(unsigned long prognum, unsigned long versnum, unsigned long procnum, char *(*procname)(char *), xdrproc_t inproc, xdrproc_t outproc);
prgnum
和versum
用作確定服務進程,根據服務器是什麼樣的就用什麼樣的,rpcinfo
看,或者是通過查看源碼。procnum
用於區分同一進程的不同方法procname
爲處理數據的地方,需要自行強轉成和接口相同函數inproc
用作解碼
和釋放
資源的函數。outproc
用作編碼的函數。- 這裏兩個函數相同是因爲都是字符串處理函數,所以使用同一個。
-
-
服務器端代碼
#include<stdio.h> #include<stdlib.h> #include<rpc/rpc.h> #define PROGNUM 12345 #define PROGVER 1 #define PROGPRO 1 bool_t decode_encode_free(XDR *a,char *c) { return xdr_wrapstring(a,&c); } int main(int argc,char**argv) { char in [10] = "hello"; char out[10] = {0}; int error; if(0!= (error= callrpc("127.0.0.1",PROGNUM,PROGVER,PROGPRO,decode_encode_free,in,decode_encode_free,out) )) { clnt_perrno(error); printf("\n"); exit(-1); } printf("send %s : recive %s\n",in,out); return 0; }
函數原型
int callrpc(char *host, unsigned long prognum, unsigned long versnum, unsigned long procnum, xdrproc_t inproc, char *in, xdrproc_t outproc, char *out);
host
是服務進程的域名或IPprgnum
和versum
表示當前服務進程procnum
表示當前進程的註冊方法。inproc
編碼函數in
表示傳入數據,可以自行在編碼函數進行處理outproc
解碼程序,用於解碼返回值out
表示緩衝數據的地方。用於接受數據的指針。
linux rpc 交互輸出 hello world
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.