【问题标题】:rpcgen adds _svc extensionrpcgen 添加 _svc 扩展
【发布时间】:2016-04-14 04:32:57
【问题描述】:

使用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 时做错了什么?


PS 同样的错误也适用于 square 和 num_of_dev 函数,例如仅给出 strlen。

谢谢!

【问题讨论】:

    标签: c linux rpc


    【解决方案1】:

    这是约定,_svc 是服务的缩写。

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

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

    【讨论】:

    • 谢谢,知道了! (意外删除评论:所以我需要实现int * strlen_1_svc(char **, struct svc_req *); 而不是int * strlen_1(char **, CLIENT *); ?)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-03
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2021-04-07
      相关资源
      最近更新 更多