第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
- P1328 生活大爆炸版石头剪刀布
- ASP.NET MVC 5 Authentication Breakdown
- jquery easyui datagrid mvc server端分页排序筛选的实现
- 左手用R右手Python系列——使用多进程进行任务处理
- 2017.9.17校内noip模拟赛解题报告
- MySQL基础入门——MySQL与R语言、Python交互
- BizTalk Orchestration execute Flat file disassembler ReceivePipeline
- MySQL基础入门系列之——字符与日期数据处理
- P2038 无线网络发射器选址
- ggplot2双坐标轴的解决方案
- Modifying namespace in XML document programmatically
- ggplot2学习笔记——图例系统及其调整函数
- 一款脑洞大开的表格可视化神器
- P3908 异或之和
- 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 数组属性和方法
- 十六进制数组转换成ASCII码
- 解决ModuleNotFoundError: No module named ‘pip’问题
- 【FreeRTos】队列管理1
- 【FreeRTOS】队列管理2
- ubuntu——Zbar 在linux/ubuntu下的安装编译
- ZBAR库
- 英文文本关系抽取(fine-tune Huggingface XLNet)
- Laravel 7.x 使用 keyspace notification 监听不到 Key 过期事件
- 嵌入式链接脚本(LINK SCRIPT)介绍
- zbar中的zbar_scan_image 函数
- PM2源码分析
- zbar库中的zbar_scan_y函数
- 快速学习-Nacos Config--服务配置
- C 库函数 - fread()
- pthread_join函数