linux rpc 交互輸出 hello world

  1. 客戶端代碼

    #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");
    }
    
    • 執行順序

      • 收到客戶端數據

        執行 decode_encode_freedecode操作,併爲指針c分配數據且複製,此操作使用malloc,也可以使用xdr_string,手動設置分配多大,但是不宜太大。
      • 執行真正調用

        執行real_invoke真正的調用,傳入參數就是之前解析的結果,並返回
      • 執行編碼操作

        執行 decode_encode_freeencode操作,編碼後發送
      • 執行資源釋放操作

        執行 decode_encode_freefree操作,測試時總是會出問題,就沒有處理。可以自己根據情況修改代碼。
    • 函數原型

      int registerrpc(unsigned long prognum, unsigned long versnum,
                     unsigned long procnum, char *(*procname)(char *),
                     xdrproc_t inproc, xdrproc_t outproc);
      
      • prgnumversum用作確定服務進程,根據服務器是什麼樣的就用什麼樣的,rpcinfo看,或者是通過查看源碼。
      • procnum用於區分同一進程的不同方法
      • procname爲處理數據的地方,需要自行強轉成和接口相同函數
      • inproc 用作解碼釋放資源的函數。
      • outproc 用作編碼的函數。
      • 這裏兩個函數相同是因爲都是字符串處理函數,所以使用同一個。
  2. 服務器端代碼

    #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 是服務進程的域名或IP
    • prgnumversum 表示當前服務進程
    • procnum表示當前進程的註冊方法。
    • inproc編碼函數
    • in表示傳入數據,可以自行在編碼函數進行處理
    • outproc 解碼程序,用於解碼返回值
    • out 表示緩衝數據的地方。用於接受數據的指針。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章