由于中间件实验的要求,需要完成linux与windows之间的rpc通信,折腾了很久,终于搞定!写这篇文章的主要原因是,在查找资料的过程中,觉着网上的资料不全,也不详细(可能我没找到更好的吧),所以记下来,希望能够给大家有点帮助,也方便自己以后查阅。
老习惯,上参考文章:(其实查了很多资料,只记得这几个了)
地址一:http://zhwl-1212.blog.163.com/blog/static/226698772011111484754376/
地址二:http://blog.csdn.net/ocean181/article/details/6785538
地址四:http://blog.csdn.net/ocean181/article/details/6785981
地址五:http://blog.csdn.net/cau99/article/details/5576187
实验环境:
linux端:fedora 16(虚拟机下),ip为192.168.100.200
windows端:win 7,ip为192.168.100.1
注意,windows端和linux端必须能够ping通,至于虚拟机的配置就不详述啦,不懂可以百度谷歌
参考地址四,完成代码工作,这样你就拥有了math.x、math_xdr.c、math.h、math_clnt.c、math_svc.c、math_client.c、math_server.c至少这7个文件,按照地址四给出的步骤,不出意外的话,恭喜你,完成了linux下本机的rpc通信
下面才是重点!!!
一、windows到linux的rpc通信,linux为服务端
1、将这7个文件全部拷到windows下,在VC6下新建一个空工程(rpc_math_client),将math.h、math_clnt.c、math_xdr.c、math_client.c这四个文件拷到你所建的工程目录(...\rpc_math_client)下,在vc6下工作区中右击Source Files,选择添加文件到目录将三个.c文件加入,右击Header Files,选择添加文件到目录,将math.h文件加入,点击编译,当然会出现很多错误。
2、将oncrpc.sdk\include目录下的文件拷到VC6自己的include目录下,比如我的是C:\Program Files\Microsoft Visual Studio\VC98\Include,
将oncrpc.sdk\win32lib目录下的pwrpc32.lib拷到VC6的lib目录下,我的是C:\Program Files\Microsoft Visual Studio\VC98\Lib,
将math_xdr.c文件中的“register int32_t *buf;”这一行删除,
在math_client.c文件的头部加上#pragma comment(lib,"pwrpc32.lib")这一行。这样编译就能通过了。
还需要将math_client.c的main函数改成
int main (int argc, char *argv[]) { char *host="192.168.100.200"; //host为你的服务端的地址 math_prog_1 (host); exit (0); }
意思就是把host写死,不用再命令行下输参数了。点击运行(在这之前,需要将你linux下的服务端起起来,命令行输./math_server &),会提示缺失“pwrpc32.dll”文件,将oncrpc.sdk\bin目录下的该文件放入你所建工程的debug目录下即可。
运行后,根据要求输入数据,等了很长时间都没反应,最后会提示“RPC: Port mapper failure - RPC: Timed out”,在地址五中有解决的方法。
再次运行,就大功告成!恭喜你,完成了windows到linux的rpc通信。
二、linux到windows的rpc通信,windows为服务端
1、在VC6下新建一个空工程(rpc_math_server),将math.h、math_svc.c、math_xdr.c、math_server.c这四个文件按照上述的方法加入工程。
2、将math_xdr.c文件中的“register int32_t *buf;”这一行删除
在math_server.c文件的头部加上#pragma comment(lib,"pwrpc32.lib")这一行
将math_svc.c文件的#include <sys/socket.h>和#include <netinet/in.h>这两行注释掉
双击oncrpc.sdk/bin目录下的portmap.exe,启动portmap
运行,同样需要将“pwrpc32.dll”文件放入debug目录下。
在linux下运行客户端(./math_client 192.168.100.1),即可得到结果。
至此,windows与linux的rpc互通信完成。可以看出,即使在windows下没有rpcgen工具也可以完成。在给出的sdk中是有rpcgen.exe的,但是个人感觉生成起来特别麻烦,各种缺少库,最后终于生成了想要的文件,编译也是一大堆错误,索性也就把linux下生成的文件直接拷到windows下了。
文中所要用到的oncrpc.sdk以及两个例子的代码可在http://down.51cto.com/data/1034805下载,希望能够帮助到大家。