我们知道用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