本文共 1643 字,大约阅读时间需要 5 分钟。
| :编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国。、、、 |
精通Unix下C语言编程与项目实践之
第19章 分布式应用技术之远程调用模型
在网络时代的生产实践中,提供服务往往是分布式地,而单个主机系统,也经常需要调用其它主机系统的服务。比如出于安全性考虑,某些数据库系统常常被限制为只能在某台(几台)主机上直接访问,这样就只有部分主机(暂时称之为数据库主机)能够访问和操作数据库。其它主机(暂时称之为远程主机)就必须调用数据库主机提供的服务才能完成数据库操作,这个远程调用的流程一般为:向数据库主机建立套接字连接,并发送访问申请。数据库主机接收这些申请,并校验远程主机的合法性,再向数据库转发操作请求,最后把数据库操作结果返回给远程主机。整个过程对于用户来说是透明的,就好像远程主机直接访问了数据库一样。 远程调用就是指本地主机运行网络中另外一台计算机上某程序、函数或服务,就如同在本机上运行一样,以上关于数据库的访问就是远程调用的一个例子。远程调用也使用了客户机-服务器模型,发送本地请求的主机是客户机,网络中另外一台实际运行进程或服务的主机就是服务器。 本章将设计一个远程调用的模型,在服务器端运行一个进程,这个进程接收客户端发送的shell请求,通过安全性验证后在服务器端运行这个shell,并将输出结果转发到客户端。 19.1 系统分析
本项目实际上是运行在服务器端的一个程序,它接收客户申请、执行shell命令、将shell输出结果转发到客户端,那么在设计项目前必须解决如下问题: 1. 接收客户端请求
服务器端如何接收并处理客户申请,包括采用什么样的通信发送,选择并发处理流程还是串行处理流程等。 2. 执行shell命令
服务器端如何运行客户请求的shell命令,选择何种方式在进程中执行其它的程序,供选择的答案有system、fork-exec和popen。 3. 获取运行的shell输出结果
由于服务器需要把进程运行时的输出结果返回给客户端,那么就必须考虑如何获取正在运行的shell进程的输出结果。 在此方案下,服务进程无法交互式的获取shell进程的输出信息,但可以通过输入输出重定向,将shell进程的输出写入到一个文件中,待shell进程执行完毕后读取该文件,并将其内容发送给客户端即可。 以管道的方式创建新进程执行shell命令,设置函数popen的参数type为“r”,就可以及时获取shell进程的输出信息了。 例1. 以popen执行命令szCmd,并将命令szCmd的输出结果打印到stderr中。 pfile = popen(szCmd, "r"); /* 创建管道、执行shell命令 */ while (fgets(szLine, sizeof(szLine), pfile) != NULL) /* 读取输出结果 */ PrintLog(stderr, szLine); /* 打印输出结果 */ pclose(pfile); /* 结束shell进程,关闭管道 */ 与采用system或fork-exec方式相比,采用popen方式执行shell命令不但设计简单,而且可以直接、及时地读取到命令的输出结果。因此,本项目以多进程并发套接字模式接收客户端的请求,并采用popen交互地执行新进程。 本文转自 zhuyunxiang 51CTO博客,原文链接:http://blog.51cto.com/zhuyunxiang/142510,如需转载请自行联系原作者