使用server-client创建一个简单的rpcgen程序。
我正在编写这个.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?时,我是否做错了什么?
同样的误差也适用于平方函数和num_of_dev函数,仅给出了一个例子。
谢谢!
发布于 2016-01-09 15:03:13
这是惯例,_svc是服务的缩写。
您的服务器需要实现服务函数,即strlen_1_svc函数。
客户端调用strlen_1函数。rpcgen + RPC库执行所有中间操作--它为客户端使用的strlen_1生成代码,该代码将序列化数据并将其传输到服务器,在服务器中,事件循环将调用strlen_1_svc函数中的代码。
发布于 2016-09-02 07:06:59
执行rpcgen ex7.x之后,您应该已经创建了客户机和服务器存根、ex7_clnt.c和ex7_svc.c以及一个头文件ex7.h。
在头文件中,您将声明两个函数strlen_1和strlen_1_svc,它们必须有不同的名称,因为它们是不同的函数:第一个在客户端,第二个在服务器端通过RPC调用调用。
https://stackoverflow.com/questions/34694896
复制相似问题