第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 = %ld\n", inp->arg1);
    sleep(5);
    out.res1 = inp->arg1 * inp->arg1;
    printf("arg = %ld\n", inp->arg1);

    return &out;
}

bool_t squareproc_2_svc(square_in* inp, square_out* outp, struct svc_req* rqstp)
{
    printf("arg = %ld\n", 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 %ld\n",
               au->aup_machname, (long)au->aup_uid, (long)au->aup_gid);
    }
    sleep(5);
    outp->res1 = inp->arg1 * inp->arg1;
    printf("arg = %ld\n", 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 usec\n", tv.tv_sec, tv.tv_usec);
    if(clnt_control(cl, CLGET_RETRY_TIMEOUT, (char*)&tv))
        printf("retry timeout = %ld sec, %ld usec\n", 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 : %ld\n", out.res1);

    return 0;
}

github: https://github.com/gongluck/unpv22-notes.git

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏chenssy

【死磕Netty】-----服务端启动过程分析

原文出处http://cmsblogs.com/ 『chenssy』 转载请注明原创出处,谢谢! 上篇博客(【死磕Netty】----Netty的核心组件及其设...

4177
来自专栏CSDN技术头条

Spring Data REST 与 Spring RestTemplate 实战详解

这篇分为两部分内容进行介绍(Spring Data REST 和 Spring RestTemplate)。我之前有一篇文章完整的介绍了 HTTP 协议的内容,...

5885
来自专栏Fish

《深入理解Spark-核心思想与源码分析》读书笔记(1)

前两章 第一章主要是讲如何安装和配置spark,以及如何导入spark源码调试运行;第二章主要讲的是上次那本书《Spark快速大数据分析》的内容,科普一下spa...

20810
来自专栏后台及大数据开发

【高并发】秒杀系统高并发请求排队处理

今天无意中看见了这位兄弟的文章 通过请求队列的方式来缓解高并发抢购(初探)  但文章最后说并发超过500 就会出现超发,看了下代码,的确有这个问题

711
来自专栏MelonTeam专栏

教你自己动手写HTTP服务器

谈到HTTP服务器,立马就能联想到Apache、Nginx等大名鼎鼎的开源组件。如果需要一个本地代理HTTP服务器,自己手写一个怎么样,会不会很难?!本文试着介...

1957
来自专栏GopherCoder

『如何构建命令行工具:YiYi』

1174
来自专栏Java技术分享

SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis)

使用 SSM ( Spring 、 SpringMVC 和 Mybatis )已经很久了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当...

1.5K13
来自专栏大内老A

WCF后续之旅(1): WCF是如何通过Binding进行通信的

《我的WCF之旅》系列自开篇以来,得到了园子里很多朋友的厚爱,并荣登了博客园2007年度系列博文Top 10。由于工作原因,沉寂了几个月,今天开始WCF新的旅程...

1829
来自专栏云计算

使用Akka HTTP构建微服务:CDC方法

原文地址:https://dzone.com/articles/building-microservices-with-akka-http-a-cdc-appr...

2325
来自专栏WindCoder

iOS集中和解耦网络:具有单例类的AFNetworking教程

当涉及iOS架构模式时,模型 - 视图 - 控制器(MVC)设计模式对于应用程序的代码库的长寿和可维护性是非常有用的。通过将它们解耦从而使类可以很容易地被重用或...

431

扫描关注云+社区