第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 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

Log4Net日志记录两种方式

     log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库...

632
来自专栏乐沙弥的世界

记一次离奇的TNS-12545 TNS-12560 TNS-00515

      最近reportDB监听无法随系统自启动,现象比较怪异。因为该服务器上的另一个实例的监听可以正常启动,这个不能自启动实例的监听手动启动又是正常的。因...

942
来自专栏杨建荣的学习笔记

通过shell脚本批量验证dataguard的有效性(r7笔记第96天)

我们假设一个场景,当你接触到一个新的环境,我们需要了解这个数据库是否为RAC,是否有备库。 如果有备库,那么问题来了,如果想去验证备库的状态是否有效,是否及时应...

2666
来自专栏杨建荣的学习笔记

Oracle备库的PDB无法连接的问题(r11笔记第6天)

今天在测试12c的temp_undo的时候,准备在备库上测试一下,突然发现备库使用TNS连接竟然失败。 抛出的错误如下: $ sqlplus sys/oracl...

3469
来自专栏Hongten

python开发_logging_日志处理

============================================================

843
来自专栏SpringBoot 核心技术

第四十七章:SpringBoot2.0新特性 - Quartz自动化配置集成本章目标SpringBoot 企业级核心技术学习专题构建项目测试总结

4303
来自专栏梦里茶室

sqlite在Android上的一个bug:SQLiteCantOpenDatabaseException when nativeExecuteForCursorWindow

这是sqlite在Android系统上的一个bug,在需要建立索引的sql语句频繁执行时,会发生这个异常。

301
来自专栏老安的博客

zabbix使用zabbix 数据库做数据分表

1253
来自专栏杨建荣的学习笔记

11g rac配置scan ip(r6笔记第30天)

如果是从10g转战11g rac就会发现很多不同之处,其中一个比较大的改变就是在11g中有了一个新特性scan,其实这是一个简称,完整的名称为:SCAN(Si...

2464
来自专栏沃趣科技

ASM 翻译系列第二十弹:ASM Internal ASM file number 7

原作者:Bane Radulovic 译者: 郭旭瑞 审核: 魏兴华 DBGeeK社群联合出品 ASM file number 7 ASM元信息7号...

3657

扫码关注云+社区