rpcgen添加_svc扩展名

时间:2016-01-09 14:49:06

标签: c linux rpc

我正在练习使用server-client创建一个简单的rpcgen程序。

我正在写这个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 square和num_of_dev函数的同样错误,例如只给出了strlen
谢谢!

2 个答案:

答案 0 :(得分:1)

这就是惯例,_svc是服务的缩写。

您的服务器需要实现服务功能,即strlen_1_svc功能。

您的客户端调用strlen_1函数。 rpcgen + RPC库完成所有中间 - 它生成客户端使用的strlen_1代码,它将序列化数据并将其传输到服务器,其中事件循环将调用调用到{{1中的代码功能。

答案 1 :(得分:0)

执行rpcgen ex7.x后,您应该创建了客户端和服务器存根ex7_clnt.cex7_svc.c以及头文件ex7.h

在头文件中,您将声明函数strlen_1strlen_1_svc,它们必须具有不同的名称,因为它们是不同的函数:第一个在客户端并调用第二个服务器端通过RPC调用。