由于中间件实验的要求,需要完成linux与windows之间的rpc通信,折腾了很久,终于搞定!写这篇文章的主要原因是,在查找资料的过程中,觉着网上的资料不全,也不详细(可能我没找到更好的吧),所以记下来,希望能够给大家有点帮助,也方便自己以后查阅。

老习惯,上参考文章:(其实查了很多资料,只记得这几个了)

地址一:http://zhwl-1212.blog.163.com/blog/static/226698772011111484754376/

地址二:http://blog.csdn.net/ocean181/article/details/6785538

地址三:http://baike.baidu.com/link?url=gcQ-tH2ioZqxpCfBGOFM_rhcUq6I4XEQATXP-GMm9Nw-xcxwSoBhdXCJ9lxA5sZ98WAUM929aWsLFO28oCOUKK

地址四: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下载,希望能够帮助到大家。