2016-01-09 61 views
0

我有一個練習,使用rpcgen創建一個簡單的server-client程序。rpcgen添加_svc擴展

我在寫這ex7.x文件:

program REMOTE_PROG { 
    version MSG_RCV { 
     int STRLEN(string)  = 1; 
     double SQUARE(double *) = 2; 
     int NUM_OF_DEV(int *) = 3; 

    } = 1; 
} = 99; 

執行與rpcgen ex7.x - >生成ex7_svc.c

ex7_svc.c文件

,出於某種原因,它生成每個功能的情況下與_svc擴展:

case STRLEN: 
    xdr_argument = xdr_wrapstring; 
    xdr_result = xdr_int; 
    local = (char *(*)()) strlen_1_svc; //<--_SVC 
    break; 

,當我嘗試實現的功能

int * strlen_1(char **, CLIENT *); 

編譯後編譯服務器引發該錯誤:

"_strlen_1_svc", referenced from: 
    _remote_prog_1 in ex7_svc-8501b7.o 
ld: symbol(s) not found for architecture x86_64 

但如果我將刪除自動生成的_svc擴展名,local = (char *(*)()) strlen_1; //no _svc程序將成功編譯。

這是爲什麼發生?爲什麼rpcgen將_svc擴展添加到函數中,當我刪除_svc時我做錯了什麼?


P.S同樣的錯誤也爲廣場和num_of_dev功能,只給了例如strlen的。

謝謝!

回答

1

這是約定,_svc是服務的簡稱。

您的服務器需要實現服務功能,即strlen_1_svc功能。

您的客戶呼叫strlen_1功能。 rpcgen + RPC庫完成所有內容 - 它生成客戶端使用的代碼strlen_1,該代碼將序列化數據並將其傳輸到服務器,其中事件循環將調用分派給strlen_1_svc函數中的代碼。

+0

謝謝,明白了! (意外刪除評論: 所以我需要實現'int * strlen_1_svc(char **,struct svc_req *);' 而不是'int * strlen_1(char **,CLIENT *);'?) –

0

rpcgen ex7.x執行後,你應該創建你已經聲明這兩個函數strlen_1strlen_1_svc在客戶端和服務器存根ex7_clnt.cex7_svc.c,也是一個頭文件ex7.h

在頭文件中,他們必須有不同的名稱因爲它們是不同的功能:第一個是在客戶端,通過RPC調用在服務器端調用第二個。