rpcgen 添加 _svc 扩展
rpcgen adds _svc extension
使用 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 时做错了什么?
P.S square 和 num_of_dev 函数也有同样的错误,例如只给出了 strlen。
谢谢!
这是惯例,_svc 是服务的缩写。
您的服务器需要实现服务功能,即strlen_1_svc
功能。
您的客户端调用 strlen_1
函数。 rpcgen + RPC 库完成所有中间工作 - 它为客户端使用的 strlen_1
生成代码,客户端将序列化数据并将其传输到服务器,事件循环将调用分派到 [=10] 中的代码=]函数。
执行 rpcgen ex7.x
后,您应该已经创建了客户端和服务器存根 ex7_clnt.c
和 ex7_svc.c
以及头文件 ex7.h
在头文件中,您将声明两个函数 strlen_1
和 strlen_1_svc
,它们必须具有不同的名称,因为它们是不同的函数:第一个在客户端并调用第二个一个在服务器端通过 RPC 调用。
使用 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 时做错了什么?
P.S square 和 num_of_dev 函数也有同样的错误,例如只给出了 strlen。
谢谢!
这是惯例,_svc 是服务的缩写。
您的服务器需要实现服务功能,即strlen_1_svc
功能。
您的客户端调用 strlen_1
函数。 rpcgen + RPC 库完成所有中间工作 - 它为客户端使用的 strlen_1
生成代码,客户端将序列化数据并将其传输到服务器,事件循环将调用分派到 [=10] 中的代码=]函数。
执行 rpcgen ex7.x
后,您应该已经创建了客户端和服务器存根 ex7_clnt.c
和 ex7_svc.c
以及头文件 ex7.h
在头文件中,您将声明两个函数 strlen_1
和 strlen_1_svc
,它们必须具有不同的名称,因为它们是不同的函数:第一个在客户端并调用第二个一个在服务器端通过 RPC 调用。