第16章 Sun RPC
时间:2022-05-03
本文章向大家介绍第16章 Sun RPC,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
RPC:远程过程调用
默认情况下服务器并不多线程化:
rpcgen -C data.x -DDEBUG
gcc server.c data_svc.c data_xdr.c -o server
gcc client.c data_clnt.c data_xdr.c -o client
多线程化:(-M 生成线程安全代码 -A 让服务器根据请求自动创建线程)
rpcgen -C data.x -DDEBUG -M
gcc server.c data_svc.c data_xdr.c -o server
gcc client.c data_clnt.c data_xdr.c -o client
#include <rpc/rpc.h>
char *clnt_sperror(CLIENT *rpch, char *s);
CLIENT *clnt_create(char *host, unsigned long prog, unsigned long vers, char *proto);
void clnt_destroy(CLIENT* cl);//显式终止一个客户的TCP连接
bool_t clnt_control(CLIENT* cl, unsigned int request, char* ptr);//request==CLGET_TIMEOUT/*总超时*/,request==CLGET_RETRY_TIMEOUT/*重试超时(UDP)*/
int svc_dg_enablecache(SVCXPRT* xprt, unsigned long size);//启用UDP高速缓存,使重复的请求不会多次调用过程
#include <rpc/clnt_stat.h>
//RPC_SUCCESS
data.x
struct square_in
{
long arg1;
};
struct square_out
{
long res1;
};
program SQUARE_PROG/*RPC程序*/
{
version SQUARE_VERS
{
square_out SQUAREPROC(square_in) = 1;/*过程*/
}=2;/*版本号*/
}=0x31230000;/*程序号*/
server.c
#include <unistd.h>
#include "data.h"
square_out* squareproc_1_svc(square_in* inp, struct svc_req* rqstp)
{
static square_out out;
printf("arg = %ldn", inp->arg1);
sleep(5);
out.res1 = inp->arg1 * inp->arg1;
printf("arg = %ldn", inp->arg1);
return &out;
}
bool_t squareproc_2_svc(square_in* inp, square_out* outp, struct svc_req* rqstp)
{
printf("arg = %ldn", inp->arg1);
if(rqstp->rq_cred.oa_flavor == AUTH_SYS)
{
struct authunix_parms* au;
au = (struct authunix_parms*)rqstp->rq_clntcred;
printf("AUTH_SYS: host %s, uid %ld, gid %ldn",
au->aup_machname, (long)au->aup_uid, (long)au->aup_gid);
}
sleep(5);
outp->res1 = inp->arg1 * inp->arg1;
printf("arg = %ldn", inp->arg1);
return TRUE;
}
int square_prog_2_freeresult(SVCXPRT* transp, xdrproc_t xdr_result, caddr_t result)
{
xdr_free(xdr_result, result);
return 1;
}
client.c
#include "data.h"
int main(int argc, const char* argv[])
{
CLIENT* cl;
square_in in;
square_out out;
struct timeval tv;
if(argc != 3)
{
printf("usage : client <hostname> <integer-value>n");
exit(-1);
}
cl = clnt_create(argv[1], SQUARE_PROG, SQUARE_VERS, "udp");
auth_destroy(cl->cl_auth);//销毁先前句柄关联的认证,空认证
cl->cl_auth = authunix_create_default();//创建默认的Unix认证结构
tv.tv_sec = 30;
tv.tv_usec = 0;
clnt_control(cl, CLSET_TIMEOUT, (char*)&tv);
clnt_control(cl, CLSET_RETRY_TIMEOUT, (char*)&tv);
if(clnt_control(cl, CLGET_TIMEOUT, (char*)&tv))
printf("timeout = %ld sec, %ld usecn", tv.tv_sec, tv.tv_usec);
if(clnt_control(cl, CLGET_RETRY_TIMEOUT, (char*)&tv))
printf("retry timeout = %ld sec, %ld usecn", tv.tv_sec, tv.tv_usec);
in.arg1 = atol(argv[2]);
if(squareproc_2(&in, &out, cl) != RPC_SUCCESS)
{
printf("%s", clnt_sperror(cl, argv[1]));
exit(-1);
}
printf("result : %ldn", out.res1);
return 0;
}
github: https://github.com/gongluck/unpv22-notes.git
- 算法(一)时间复杂度
- Android Studio详细安装流程和配置、主题
- html5 jqueryrotate插件实现旋转动画
- 为什么要使用String
- Android网络编程(十一)源码解析Retrofit
- android Material Design详解
- android EventBus详解(三)
- Android绘制优化(一)绘制性能分析
- android EventBus详解(二)
- [置顶] android EventBus详解(一)
- 开源组件photoView学习
- ViewPagerIndicator+viewpager指示器详解
- 实现去哪儿来回机票选择的view
- 解决水平ListView在ScrollView中出现的滑动冲突
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- nali一个可以查询IP归属和CDN的命令
- 图片采集,python多线程采集头像图片源码附exe程序及资源包
- Python json数据爬取处理,红点官网大奖设计作品爬取
- 斗图狂魔必备沙雕表情包,python多线程爬取斗图啦表情图片
- 5个基本Linux命令行工具的现代化替代品
- Chrome 84 正式发布,支持私有方法、用户空闲检测!
- 类及数据库的应用,G-MARK网站数据Python爬虫系统的构建
- 获取素材图无忧,Pixabay图库网Python多线程采集下载
- Python关键词数据采集案例,5118查询网站关键词数据采集
- Python结巴分词,字符串余弦相似度算法实现关键词筛选及整理
- git的分支远程连接和远程分支的拉取推送及冲突处理
- requests session的应用,python金点设计奖数据爬虫
- 站长工具关键词挖掘采集,Python关键词批量挖掘采集工具
- python百度关键词相关搜索词采集,链轮查询采集exe工具
- Python最火爬虫框架Scrapy入门与实践,豆瓣电影 Top 250 数据采集