我正在练习使用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
谢谢!
答案 0 :(得分:1)
这就是惯例,_svc是服务的缩写。
您的服务器需要实现服务功能,即strlen_1_svc
功能。
您的客户端调用strlen_1
函数。 rpcgen + RPC库完成所有中间 - 它生成客户端使用的strlen_1
代码,它将序列化数据并将其传输到服务器,其中事件循环将调用调用到{{1中的代码功能。
答案 1 :(得分:0)
执行rpcgen ex7.x
后,您应该创建了客户端和服务器存根ex7_clnt.c
和ex7_svc.c
以及头文件ex7.h
在头文件中,您将声明函数strlen_1
和strlen_1_svc
,它们必须具有不同的名称,因为它们是不同的函数:第一个在客户端并调用第二个服务器端通过RPC调用。