我们知道用rpcgen命令能生成服务器和客户端代码以及Makefile,开发人员可以在生成的demo code上进行二次开发,然后把代码集中到系统中去。基于Linux的开系统中,类似git的颁布管理工具和类似makefile的代码编译生成工具常常用到,那么在实际的项目实践中,rpc生成的哪些代码又该怎样用makefile和git管理维护呢?下面结合本人最近的工作实践和大家一起探讨,欢迎各位批评指正。
1、makefile里如何使用RPC及其生成代码
根据rpcgen生成代码的命名规则,可以在Makefile里定义rpcgen工具生成的client端和server端的程序,比如下面的代码:
SOURCES.x = my_rpc.x #定义了rpcgen所依赖的.x文件
# Three files below was generated by rpcgen
my_RPC_CLNT=my_rpc_clnt.c#定义了客户端的程序
my_RPC_SVC=my_rpc_svc.c #定义了服务器端的程序
my_RPC_HEAD=my_rpc.h #定义了头文件的名字
# abstract common functions from un-generated my_rpc_client.c and
# my_rpc_server.c for usage of upper layer software
mylib_rpc_lib=mylib_rpc_lib.c#在rpcgen生成的代码上修改的需要保留的代码
my_RPC_SRC=$(my_RPC_CLNT) $(my_RPC_SVC) $(mylib_rpc_lib) #表示所有的.c文件
my_RPC_OBJS=$(patsubst %.c,%.o,$(notdir ${my_RPC_SRC})) #表示my_RPC_OBJS=mylib_rpc_lib.o
……………..
$(my_RPC_OBJS):%.o:%.c#表示 mylib_rpc_lib.o: my_rpc_lib.c
gcc -c -o $@ $^ $(CFLAGS) $(INCLUDE)
#生成client端程序的命令:
$(my_RPC_CLNT): $(SOURCES.x)
[[ ! -f $@ ]] && rpcgen -C -l $^ -o $@
#生成客户端端程序的命令:
$(my_RPC_SVC): $(SOURCES.x)
[[ ! -f $@ ]] && rpcgen -C -m $^ -o $@
#指定makefile命令默认的target中包括gencode
.PHONY: all
all: gencode $(TARGET) install
#指定如何生成my_RPC所依赖的头文件
.PHONY: gencode
gencode:
-[[ ! -f $(my_RPC_HEAD) ]] && rpcgen -C -h $(SOURCES.x) -o $(my_RPC_HEAD)
#指定当运行make clean时,清除*.o和rpcgen生成的客户端和服务器端的代码。
clean:
rm -rf *.o *.a $(my_RPC_CLNT) $(my_RPC_SVC) $(my_RPC_HEAD)
2、RPC相关程序的调试
利用上面Makefile最后生成可执行文件,并不表示大功告成。实际运行时候,还可能碰到多种问题,碰到这些问题后,可以先尝试客户端和服务器端程序在同一个节点机器上运行时,是否出现问题:如果也出现问题,需要检查源程序包括.c代码和.x程序;如果在同一个节点上运行没有出现问题,而在多个节点上运行时出现问题,比如下面的几种:
1. connection refused;
2. unable to route to XXX (IP);
3. Connection timeout;
那么需要检查系统的111端口、RPC服务以及防火墙设置,在CentOS上,可以尝试下面的脚本,来禁用firewall、启动111端口和RPC服务:
systemctl start firewalld.service
systemctl start rpcbind.service
firewall-cmd --add-service=rpc-bind --permanent
firewall-cmd --add-port=111/tcp --permanent
firewall-cmd --add-port=111/udp --permanent
systemctl stop firewalld.service
本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1768040 ,如需转载请自行联系原作者