我有一个练习,可以使用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扩展,程序将成功编译。
为什么会这样?为什么rpcgen会将svc扩展添加到函数中,并且在删除svc时我是否做错了什么?
P.S同样的误差也适用于平方和num_dev函数,例如只给出strlen。
谢谢!

最佳答案

这是惯例,svc是服务的缩写。
您的服务器需要实现服务功能,即strlen_1_svc功能。
您的客户机调用strlen_1函数。rpcgen+RPC库执行所有中间任务-它为客户端使用的strlen_1生成代码,该代码将序列化数据并将其传输到服务器,在服务器上,事件循环将对strlen_1_svc函数中的代码的调用分派给您。

关于c - rpcgen添加_svc扩展名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34694896/

10-10 05:21