spnfsd文件夹

首先,编写mdsadd.x文件,使用rpcgen -M mdsadd.x

生成mdsadd.h mdsadd_clnt.c mdsadd_svc.c mdsadd_xdr.c

分别是一些用到的头文件及远程函数的定义、客户端存根、服务器端存根、远程数据转换。

具体的一些代码功能参见文章 rpc生成文件解读,link address:http://www.cnblogs.com/xindufresne/p/3425554.html

程序员自己编写的客户端和服务器端的代码,这个是一定需要搞清楚的。

实际上,客户端调用某个过程(实际上是每个program里面会含有几个不等的过程)是使用,自己在.x文件里面生命的过程原型加上_1来调用,服务器端,映射到函数式"原过程名"+"_1"+"_svc"。

因此,具体的函数内容是要在"原过程名"+"_1"+"_svc"函数体里面定义。

但是调用的时候,是要使用“函数名_1”。参见博文rpc调用的一个例子:http://www.cnblogs.com/xindufresne/p/3409762.html

在test.x 文件里面定义的 program名是test,所以生成的文件中,都是test_*.。里面定义热一个过程filename func(filename)调用。

因此查看client.c(自己编写程序建议使用“test_client.c”这样便于实现一致性,统一的编程风格)可以看到,首先需要分配好想要RPC调用返回的数据空间。有两句是必须要有的。

CLIENT *cl;
enum clnt_stat res;

cl = clnt_create (host, test, test_ver, "tcp");
if (cl == NULL) {
clnt_pcreateerror (host);
return 1;
}

仅仅创建之后,可能会导致内存的泄露,因此一般还要设置以detatch状态创建。

然后就可以直接调用。如:res=func_1(&in,&out,cl) 这里cl是创建进程后的进程的句柄。in是传递的值得地址,out是传回来的值。当然这个可以自己定义。

再来看客户端:

函数定义为

bool_t func_1_svc(filename *in, filename *out, struct svc_req *s)
从总体上来说,实际上,就和本地的过程调用时一样的 。本地是调用func(),直接就返回了结果,现在因为不在一台pc上,因此需要做一些修改,但是完成的依然是这些功能,只不过调用的是 func_1(),然后在服务器端,对应的是func_1_svc()函数。但是返回的,是一样的,依然会正常返回,其他内容,都是封装的。这就是RPC调用的本质。

 

 

 

转载于:https://www.cnblogs.com/xindufresne/p/3426928.html

你可能感兴趣的:(spnfsd文件夹)