rpcgen 添加 _svc 扩展

rpcgen adds _svc extension

使用 rpcgen 创建一个简单的 server-client 程序。

我正在写这个 .x 文件:

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

    } = 1;
} = 99;

rpcgen file.x 一起执行 -> 生成 file_svc.c

file_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 file_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。

谢谢!

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

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

您的客户端调用 strlen_1 函数。 rpcgen + RPC 库完成所有中间工作 - 它为客户端使用的 strlen_1 生成代码,客户端将序列化数据并将其传输到服务器,事件循环将调用分派到 [=10] 中的代码=]函数。

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

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