linuxrpc架构------rpcbind源码简易分析与测试实例

linuxrpc架构------rpcbind源码简易分析与测试实例1. 如何使⽤rpc?
先要安装rpcbind库(可能需要portmap⽀持)
启动rpcbind服务:
service rpcbind start/status/stop 需要输⼊密码, or
systemctl start/status/stop rpcbind
查看服务是否启动,我的ubuntu16.04如下信息:
systemctl status rpcbind.*
● rpcbind.socket - RPCbind Server Activation Socket
Loaded: loaded (/lib/systemd/system/rpcbind.socket; enabled; vendor preset: enabled)
Active: active (running) since 三 2019-12-25 16:03:06 CST; 1 day 17h ago
Listen: /run/rpcbind.sock (Stream)
12⽉ 25 16:03:06 neo systemd[1]: Listening on RPCbind Server Activation Socket.
12⽉ 26 15:13:31 neo systemd[1]: Listening on RPCbind Server Activation Socket.
● rpcbind.service - RPC bind portmap service
Loaded: loaded (/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
Drop-In: /run/systemd/generator/rpcbind.service.d
└─f
Active: active (running) since 三 2019-12-25 16:03:08 CST; 1 day 17h ago
Main PID: 13037 (rpcbind)
Tasks: 1
钽酸锂晶体Memory: 244.0K
CPU: 185ms
CGroup: /system.slice/rpcbind.service
└─13037 /sbin/rpcbind -f -w
12⽉ 25 16:03:08 neo systemd[1]: Starting RPC bind
12⽉ 25 16:03:08 neo systemd[1]: Started RPC bind portmap service.
12⽉ 26 15:13:32 neo systemd[1]: Started RPC bind portmap service.
● rpcbind.target - RPC Port Mapper
Loaded: loaded (/f.d/rpcbind; static; vendor preset: enabled)
Drop-In: /run/systemd/generator/rpcbind.target.d
└─f
Active: active since 三 2019-12-25 16:03:08 CST; 1 day 17h ago
Docs: man:systemd.special(7)
12⽉ 25 16:03:08 neo systemd[1]: Reached target RPC Port Mapper.
使⽤service命令,信息没有上⾯的全⾯.
service rpcbind status
● rpcbind.service - RPC bind portmap service
Loaded: loaded (/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
Drop-In: /run/systemd/generator/rpcbind.service.d
└─f
Active: active (running) since 三 2019-12-25 16:03:08 CST; 1 day 17h ago
Main PID: 13037 (rpcbind)
Tasks: 1
Memory: 292.0K
CPU: 185ms
CGroup: /system.slice/rpcbind.service
└─13037 /sbin/rpcbind -f -w
12⽉ 25 16:03:08 neo systemd[1]: Starting RPC bind
12⽉ 25 16:03:08 neo systemd[1]: Started RPC bind portmap service.
12⽉ 26 15:13:32 neo systemd[1]: Started RPC bind portmap service.
2. 查看rpcbind中注册的服务
使⽤rpcinfo命令, 可以使⽤man rpcinfo查看参数⽤法,默认如下或者带上参数-p,都是本地host的信息.
program version netid    address                service    owner
100000    4    tcp6      ::.0.111              portmapper superuser
100000    3    tcp6      ::.0.111              portmapper superuser
100000    4    udp6      ::.0.111              portmapper superuser
100000    3    udp6      ::.0.111              portmapper superuser
100000    4    tcp      0.0.0.0.0.111          portmapper superuser
100000    3    tcp      0.0.0.0.0.111          portmapper superuser
100000    2    tcp      0.0.0.0.0.111          portmapper superuser
100000    4    udp      0.0.0.0.0.111          portmapper superuser
100000    3    udp      0.0.0.0.0.111          portmapper superuser
100000    2    udp      0.0.0.0.0.111          portmapper superuser
100000    4    local    /run/rpcbind.sock      portmapper superuser
100000    3    local    /run/rpcbind.sock      portmapper superuser
824377344    1    udp      0.0.0.0.169.226        -          unknown
824377344    1    tcp      0.0.0.0.206.254        -          unknown
939524112    1    udp      0.0.0.0.211.132        -          unknown
939524112    2    udp      0.0.0.0.211.132        -          unknown
939524112    1    tcp      0.0.0.0.200.190        -          unknown
939524112    2    tcp      0.0.0.0.200.190        -          unknown
939524113    1    udp      0.0.0.0.164.104        -          unknown
939524113    1    tcp      0.0.0.0.237.171        -          unknown
neo@neo:~/fu/workdir/workspace/go-master/test$ sys
风筝绞盘3. 如何编译rpcbind源码?
使⽤configure来⽣成Makefile⽂件,参数指定,可以使⽤-h查看后config,之后使⽤make编译出rpcbind和rpcinfo命令,这个可以⾃⾏百度.
4. rpcbind源码简易分析:
--------------------------------rpcbind架构----------------------------------------------------------
1. server如何注册?
2. client如何查询(调⽤)server提供的接⼝?
3. rpcbind是如何管理各个server以及如何根据client的需求来调⽤server中对应的接⼝?
查:
通过[program, version, netid]来查
注册server:
头插法到rpcb的单链表中
⼊⼝:
rpcbind.c->main()
0. 解析参数,并检查rpcbind是否已经执⾏了(通过锁(#define RPCBINDDLOCK "/var/run/rpcbind.lock")来决定)
1. 常规设置
1.1 /* Number of open files.  */ RLIMIT_NOFILE(resource.h)
1.2 geteuid判断是否是root⽤户执⾏
1.3 使⽤local service file⽤来服务查询
1.4 获取net配置(/etc/netconfig),解析相关信息:⽐如sock,addr等,并注册默认的⼀些server.
1.5 初始化syslog
1.6 设置信号处理函数
2. 进⼊loop(my_svc_run)
......
实例:    定义⼀个*.x⽂件来描述这个远程server的接⼝,使⽤rpcgen⾃动⽣成(rpcgen -C *.x),
并⾃动完成server端的stub和client端的proxy,类似android-binder机制.
server端:
实现PROJECTproc_1_svc函数,即业务函数.
以下是⾃动⽣成部分:
svc_register注册udp和tcp协议的server
client端:
使⽤clnt_create()来获取⼀个CLIENT对象,并给该对象传递参数数据,调⽤PROJECTproc_1, 实际是调⽤PROJECTproc_1_svc    其中PROJECTproc_1就是proxy, PROJECTproc_1_svc就饿是stub.
-------------------------------------end----------------------------------------------------------------
5. 测试例⼦,有三个例⼦,只是编译⽅式不同
Makefile
include Make.defines
chatcfile=chat_cli.c
chatsfile=chat_srv.c
聚酰亚胺纤维
PROGS = client server myrpc_cli myrpc_srv chat_cli chat_srv
all: ${PROGS}
# PRG.x -> PRG.h PRG_clnt.c PRG_svc.c PRG_xdr.c
# 客户代理PROXY: PRG_clnt.o <= PRG_clnt.c PRG.h
# 服务端STUB: PRG_svc.o <= PRG_svc.c PRG.h
# 客户端client: client <= PRG.h 客户端业务代码客户代理PROXY PRG_xdr.o
# 服务端server: server <= PRG.h 服务端业务代码服务端STUB PRG_xdr.o
# ⽣成框架⽂件
chat.h chat_clnt.c chat_svc.c chat_xdr.c: chat.x
rpcgen chat.x
# ⽣成客户端⼊⼝⽂件
ifeq (${chatcfile},${wildcard ${chatcfile}})
@echo  ${chatcfile} exist
else
防砸鞋chat_cli.c: chat.x
rpcgen -Sc -o $@ chat.x
endif
# ⽣成服务端⼊⼝⽂件
ifeq (${chatsfile},${wildcard ${chatsfile}})
@echo  ${chatsfile} exist
else
chat_srv.c: chat.x
rpcgen -Ss -o $@ chat.x
endif
# 编译客户端
chat_cli: chat_clnt.c chat_cli.c chat_xdr.c
${CC} ${CFLAGS} -o $@ chat_clnt.c chat_cli.c chat_xdr.c \
${LIBS} ${LIBS_RPC}
# 编译服务端
chat_srv: chat_svc.c chat_srv.c chat_xdr.c
${CC} ${CFLAGS} -o $@ chat_svc.c chat_srv.c chat_xdr.c \
${LIBS} ${LIBS_RPC}
myrpc.h myrpc_clnt.c myrpc_svc.c myrpc_xdr.c: myrpc.x
rpcgen -C myrpc.x
myrpc_clnt.o: myrpc_clnt.c myrpc.h
myrpc_svc.o: myrpc_svc.c myrpc.h
myrpc_cli: myrpc.h myrpc_client.o myrpc_clnt.o myrpc_xdr.o
${CC} ${CFLAGS} -o $@ myrpc_client.o myrpc_clnt.o myrpc_xdr.o \
${LIBS} ${LIBS_RPC}
myrpc_srv: myrpc.h myrpc_server.o myrpc_svc.o myrpc_xdr.o
${CC} ${CFLAGS} -o $@ myrpc_server.o myrpc_svc.o myrpc_xdr.o \
${LIBS} ${LIBS_RPC}
square.h square_clnt.c square_svc.c square_xdr.c: square.x
rpcgen -C square.x
square_clnt.o: square_clnt.c square.h
square_svc.o: square_svc.c square.h
client: square.h client.o square_clnt.o square_xdr.o
${CC} ${CFLAGS} -o $@ client.o square_clnt.o square_xdr.o \
${LIBS} ${LIBS_RPC}
server: square.h server.o square_svc.o square_xdr.o
${CC} ${CFLAGS} -o $@ server.o square_svc.o square_xdr.o \
${LIBS} ${LIBS_RPC}
clean:
rm -f ${PROGS} ${CLEANFILES} *_clnt.c *_svc.c *_xdr.c square.h myrpc.h  chat.h Make.defines从uniipc移植过来的
#
# This file is generated by autoconf from "Make.defines.in".
#
# This is the "Make.defines" file that almost every "Makefile" in the
# source directories below this directory include.
# The "../" in the pathnames actually refer to this directory, since
# "make" is executed in all the subdirectories of this directory.
#
# System =
CC = gcc
CFLAGS = -g -O2 -D_REENTRANT -Wall
LIBS = -lrt -lpthread
LIBS_RPC =
RANLIB = ranlib
RPCGEN_OPTS = -C
# Following is the main library, built from all the object files
# in the lib/ directories.
LIBUNPIPC_NAME =
# Following are all the object files to create in the lib/ directory.
#LIB_OBJS =  daemon_inetd.o daemon_init.o error.o gf_time.o lock_reg.o lock_test.o my_shm.o px_ipc_name.o readable_timeo.o readline.o readn.o set_concu
CLEANFILES = core core.* *.core *.o temp.* *.out typescript* \
*.[234]c *.[234]h *.bsdi *.sparc *.uw
chat.x
#define MY_RPC_PROG_NUM        0x38000011  /* 程序号 */
struct request
{        /* 定义消息结构 */
int mtype;
int len;
char req[1024];
};
struct response
胸片数据库{        /* 定义消息结构 */
int mtype;
int len;
char resp[1024];
int status;
};
program MY_RPC_PROG {
version MY_RPC_VERS1 {止动环
response MY_RPCC(request) = 1;    /* 过称号 = 1 */
} = 1;        /* Version number = 1 */
} = MY_RPC_PROG_NUM;    /* Program number */
/*
*          程序号范围简述
0x00000000 - 0x1FFFFFFF    由Sun公司定义,提供特定服务
0x20000000 - 0x3FFFFFFF    由程序员⾃⼰定义,提供本地服务或⽤于调试
0x40000000 - 0x5FFFFFFF    ⽤于短时间使⽤的程序,例如回调程序
0x60000000 - 0xFFFFFFFF    保留程序号
*/
chat_cli.c

本文发布于:2024-09-21 14:49:37,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/102664.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:程序   参数   服务   定义   业务   来调
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议