近期课程的作业需要用到RPC编程,除了课堂上学到的知识,还得亲自动手。打算先写个简单的HelloWorld练习一下,顺便复习一下学到的知识。
RPC意为远程过程调用协议(Remote Procedure Call Protocol)。编制好单机应用程序,然后划分为两个或多个程序片,加入通信协议使得每片可以在单独的计算机上运行。从一个程序片调用另一个程序片的过程称为远程过程调用,即RPC。它是一个C/S模型,调用程序称为rpc client,被调用程序片称为rpc server。
对于RPC的编程过程可以简化如下:
1.构建解决问题的常规应用程序;
2.选择一组过程形成远程程序,以便将远程程序转移到远程机器中,通过这种方法将程序分解;
3.为远程程序编写RPC界面(xxx.idl),包括远程的名字及其编号,还有对其参数的申明,选择远程程序号和版本号;
4.运行rpcgen检查该界面,如果合法,便生成四个源代码文件:xxx.h(类型说明文件)、xxx_XDR.c(XDR转换例程)、xxx_clnt.c(客户端的stub)以及xxx_svc.c(服务守护过程,服务端的stub) ,这些文件将在客户和服务器程序中使用;
5.为客户端和服务器端编写stub接口例程;
6.编译并链接客户程序。它由四个主要文件组成:去掉了远程过程的程序、客户端的stub(rpc生成)、客户端的stub接口以及XDR过程( rpc生成)。
7.编译并链接服务器程序。它由四个主要文件组成:远程过程组成的程序、服务器的stub(rpc生成)、服务器端的stub接口以及XDR过程( rpc生成)。
8.在远程机器上启动服务器,接着在本机上启动客户。
简单来讲,需要做的主要工作就是编写应用程序并分片,编写接口(规格说明文件),编写stub接口例程,编写主函数。通信协议的实现和XDR数据格式的统一交给rpcgen完成,它会自动生成相关的代码。
练习的代码的参考: 这个程序的目的是客户端接收一个参数(设置为HelloWorld),发送给服务器,然后服务器显示自己的提示信息和客户端发来的信息。
调试不是很顺利,最开始时遇到了提示:Cannot register service: RPC: Unable to receive; errno = Connection refused。上网搜索得知,是因为服务器没有开启端口映射的功能,开启portmap就可以了。
sudo /etc/init.d/portmap restart 当然,我的Linux虚拟机没有安装portmap,需要安装。执行下面的命令:
sudo apt-get install portmap
此时仍然报错:Cannot register service: RPC: Authentication error; why = Client credential too weak。这个看着百思不得其解,因为参数设置不是按照参考代码就是自动生成的(只有program编号是根据划分规则修改的),完全不知道错在哪里,查了很多资料也一头雾水。最后看到了一项搜索结果的预览(),提到了Fedora7出现这种问题改成超级用户即可。虽然现在虚拟机里用的是Ubuntu11.10,不过还是在运行编译好的文件前加了个sudo。输完密码果然显示需要的结果,这个小练习可以告一段落了。