我有一个练习,可以使用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/