2024年1月5日发(作者:)
RPC编程遇到的问题与解决方法
1. 基础工具
rpcgen的windows版本“oncrpc_win32_release_2”,下载地址/projects/oncrpc-windows。这是Windows下的rpcgen工具,可正常编译,需要在编译的选项上增加WIN32的定义,如图1所示:
另外在Include选项上增加“........oncrpcwin32include;”,如图2所示:
2. RPC编程的参考文档
linux与windows的RPC互通信的完整例子。参考“/ocean181/article/details/6785981”在linux下编写接口代码math.x,然后使用“rpcgen –a math.x”命令产生必要的rpc代码,如表1所示,客户端需要的代码为“math_clnt.c、math.h、math_xdr.c和math_client.c”,服务器端需要的代码为“math_svc.c、math.h、math_xdr.c和math_server.c”。
文件名
作用
该文件用于编译所有客户机,服务器代码
该文件包含client_stub,程序员一般不用修改
该文件包含server_stub,程序员一般不用修改
该文件包含了从说明中产生的所有XDR类型
该文件包含了客户机和服务器stub所需的XDR过滤器,程序员一般不用修改
如果生成此文件,则该文件包含远程服务的stub
如果生成此文件,则该文件包含了骨架客户机程序。
math_clnt.c
math_svc.c
math.h
math_xdr.c
math_server.c
math_client.c
Linux服务端代码编译:gcc–o __server.c
Linux客户端代码编译:gcc –o math___client.c
Windows客户端代码编译:建立新的空工程,将客户端的代码添加到工程中,添加oncrpc的include目录和lib目录,使用lib文件,使用动态库文件,修改编译错误。
3. 测试过程中遇到的问题
服务器无法启动,错误如下:
Cannot register service: RPC: Unable to receive; errno = Connection refused
unable to register (TESTPROG, VERSION, udp).
问题原因:系统没有安装portmap或者没有启动portmap端口映射。
解决方法:在新版的ubuntu中portmap被rpcbind所代替,所以需要启动rpcbind服务。
不能注册服务,错误如下:
Cannot register service: RPC: Authentication error; why = Client credential too weak
unable to register (MATH_PROG, MATH_VER, udp).wh@wh-virtual-machine:~/RPCTest$
错误原因:不是portmap服务,而是rpcbind服务
解决方法:使用新的命令重新启动rpcbind服务,“rpcbind –i -w”。具体过程,“ps
–ef |grep“rpcbind””“kill pid”“sudorpcbind –i -w”。
客户端遇到的问题
当我们把linux下面的客户端代码复制到windows端编译,并运行的时候,程序没有反应退出。
错误原因:在Windows系统下的TCP/IP编程,需要首先调用WSA_STARTUP函数,通过调试oncrpc的clnt_create代码发现问题存在。
解决方法:在客户端的代码中调用clnt_create代码之前调用rpc_nt_init(),在客户端代码结束前调用rpc_nt_exit()。


发布评论