⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 558.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="559.htm">下一篇</a>]
<hr><p align="left"><small>  <br>

  <br>

  <br>

发信人: cloudsky (小四), 信区: Security ;32mWWW-POSTm <br>

  <br>

标  题: RPC/XDR/NFS系列之----RPC编程初战(1) <br>

  <br>

发信站: 武汉白云黄鹤站 (Sun Feb 20 11:47:16 2000) , 站内信件 <br>

  <br>

  <br>

  <br>

★ 编写stub接口例程 <br>

  <br>

  <br>

  <br>

rpcgen产生的文件并没有构成完整的程序,要求程序员必须编写client和server <br>

  <br>

端的stub接口例程,在远程程序中的每个远程过程都必须存在一个stub接口例程。 <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

/* rdict_cif.c -- initw, insertw, deletew, lookupw */ <br>

  <br>

  <br>

  <br>

#include <rpc/rpc.h> <br>

  <br>

  <br>

  <br>

#include <stdio.h> <br>

  <br>

  <br>

  <br>

#include "rdict.h" <br>

  <br>

  <br>

  <br>

/* Client-side stub interface routines written by programmer */ <br>

  <br>

  <br>

  <br>

extern CLIENT * handle;  /* handle for remote procedure */ <br>

  <br>

  <br>

static int *    ret;     /* tmp storage for return code */ <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * initw -- client interface routine that calls initw_1 <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int initw ( void ) <br>

  <br>

{ <br>

  <br>

    ret = initw_1( 0, handle ); <br>

  <br>

    return( ret == 0 ? 0 : *ret ); <br>

  <br>

  <br>

}  /* end of initw */ <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * insertw -- client interface routine that calls insertw_1 <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int insertw ( char * word ) <br>

  <br>

{ <br>

  <br>

    char ** arg;  /* pointer to argument */ <br>

  <br>

    arg = &word; <br>

  <br>

  <br>

  <br>

  <br>

    ret = insertw_1( arg, handle ); <br>

  <br>

    return( ret == 0 ? 0 : *ret ); <br>

  <br>

}  /* end of insertw */ <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * deletew -- client interface routine that calls deletew_1 <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int deletew ( char * word ) <br>

  <br>

  <br>

{ <br>

  <br>

    char ** arg;  /* pointer to argument */ <br>

  <br>

    arg = &word; <br>

  <br>

    ret = deletew_1( arg, handle ); <br>

  <br>

    return( ret == 0 ? 0 : *ret ); <br>

  <br>

}  /* end of deletew */ <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

#include <rpc/rpc.h> <br>

  <br>

  <br>

  <br>

#include "rdict.h" <br>

  <br>

  <br>

  <br>

  <br>

/* Server-side stub interface routines written by programmer */ <br>

  <br>

  <br>

  <br>

static int retcode; <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * initw_1_svc -- server side interface to remote procedure initw <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int * initw_1_svc ( void * v, struct svc_req * s ) <br>

  <br>

  <br>

{ <br>

  <br>

    retcode = initw(); <br>

  <br>

    return( &retcode ); <br>

  <br>

}  /* end of initw_1_svc */ <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * insertw_1_svc -- server side interface to remote procedure insertw <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int * insertw_1_svc ( char ** word, struct svc_req * s ) <br>

  <br>

  <br>

{ <br>

  <br>

    retcode = insertw( *word ); <br>

  <br>

    return( &retcode ); <br>

  <br>

}  /* end of insertw_1_svc */ <br>

  <br>

  <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * deletew_1_svc -- server side interface to remote procedure deletew <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

  <br>

int * deletew_1_svc ( char ** word, struct svc_req * s ) <br>

  <br>

{ <br>

  <br>

    retcode = deletew( *word ); <br>

  <br>

    return( &retcode ); <br>

  <br>

}  /* end of deletew_1_svc */ <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * lookupw_1_svc -- server side interface to remote procedure lookupw <br>

  <br>

因为新版本使用了RPC,程序需要包含<rpc/rpc.h>以及"rdict.h",后者包含了 <br>

  <br>

client和server都要使用的常量的定义。client程序还需要声明并初始化一个 <br>

  <br>

句柄(handle),RPC通信例程使用该句柄与server通信。多数客户机使用已经定 <br>

  <br>

  <br>

义的类型CLIENT声明这个句柄,调用RPC库例程clnt_create来初始化这个句柄。 <br>

  <br>

  <br>

  <br>

/* rdict.c -- main, nextin */ <br>

  <br>

  <br>

  <br>

#include <rpc/rpc.h> <br>

  <br>

  <br>

  <br>

  <br>

  <br>

#include <stdlib.h> <br>

  <br>

#include <stdio.h> <br>

  <br>

#include <ctype.h> <br>

  <br>

  <br>

  <br>

  <br>

#include "rdict.h" <br>

  <br>

  <br>

  <br>

#define MAXWORD   50          /* maximum length of a command or word <br>

  <br>

*/ <br>

  <br>

#define RMACHINE "localhost"  /* name of remote machine */ <br>

  <br>

CLIENT * handle;              /* handle for remote procedure */ <br>

  <br>

  <br>

  <br>

/* 函数原型 */ <br>

  <br>

int nextin  ( char * cmd, char * word ); <br>

  <br>

int initw   ( void ); <br>

  <br>

int insertw ( const char * word ); <br>

  <br>

  <br>

int deletew ( const char * word ); <br>

  <br>

int lookupw ( const char * word ); <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * main -- insert, delete, or lookup words in a dictionary as <br>

  <br>

specified <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int main ( int argc, char * argv[] ) <br>

  <br>

{ <br>

  <br>

  <br>

    char word[ MAXWORD + 1 ];  /* space to hold word from input line <br>

  <br>

*/ <br>

  <br>

    char cmd; <br>

  <br>

    int  wordlen;  /* length of input word */ <br>

  <br>

  <br>

  <br>

    /* set up connection for remote procedure call */ <br>

  <br>

    handle = clnt_create( RMACHINE, RDICTPROG, RDICTVERS, "tcp" ); <br>

  <br>

    if ( handle == 0 ) <br>

  <br>

    { <br>

  <br>

        printf( "Could not contact remote program.\n" ); <br>

  <br>

        exit( 1 ); <br>

  <br>

  <br>

    } <br>

  <br>

    /* 上面是分布式版字典程序client端增加的代码,与dict1.c做比较 */ <br>

  <br>

  <br>

  <br>

    printf( "Please input:\n" ); <br>

  <br>

    while ( 1 ) <br>

  <br>

    { <br>

  <br>

        wordlen = nextin( &cmd, word ); <br>

  <br>

        if ( wordlen < 0 ) <br>

  <br>

        { <br>

  <br>

            exit( 0 ); <br>

  <br>

        } <br>

  <br>

  <br>

        switch ( cmd ) <br>

  <br>

        { <br>

  <br>

        case 'I':  /* 初始化 */ <br>

  <br>

            initw(); <br>

  <br>

            printf( "Dictionary initialized to empty.\n" ); <br>

  <br>

            break; <br>

  <br>

        case 'i':  /* 插入 */ <br>

  <br>

            insertw( word ); <br>

  <br>

            printf( "%s inserted.\n", word ); <br>

  <br>

            break; <br>

  <br>

        case 'd':  /* 删除 */ <br>

  <br>

  <br>

            if ( deletew( word ) ) <br>

  <br>

            { <br>

  <br>

                printf( "%s deleted.\n", word ); <br>

  <br>

            } <br>

  <br>

            else <br>

  <br>

            { <br>

  <br>

                printf( "%s not found.\n", word ); <br>

  <br>

            } <br>

  <br>

            break; <br>

  <br>

        case 'l':  /* 查询 */ <br>

  <br>

  <br>

  <br>

  <br>

            if ( lookupw( word ) ) <br>

  <br>

            { <br>

  <br>

                printf( "%s was found.\n", word ); <br>

  <br>

            } <br>

  <br>

            else <br>

  <br>

            { <br>

  <br>

                printf( "%s was not found.\n", word ); <br>

  <br>

            } <br>

  <br>

            break; <br>

  <br>

        case 'q':  /* 退出 */ <br>

  <br>

            printf( "Program quits.\n" ); <br>

  <br>

  <br>

            exit( 0 ); <br>

  <br>

            break; <br>

  <br>

        default:  /* 非法输入 */ <br>

  <br>

            printf( "command %c invalid.\n", cmd ); <br>

  <br>

            break; <br>

  <br>

        }  /* end of switch */ <br>

  <br>

    }  /* end of while */ <br>

  <br>

    return 0; <br>

  <br>

}  /* end of main */ <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

  <br>

 * nextin -- read a command and(possibly) a word from the next input <br>

  <br>

line <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int nextin ( char * cmd, char * word ) <br>

  <br>

{ <br>

  <br>

    int i, ch; <br>

  <br>

    ch = getc( stdin ); <br>

  <br>

    while ( isspace( ch ) ) <br>

  <br>

    { <br>

  <br>

  <br>

        ch = getc( stdin ); <br>

  <br>

    }  /* end of while */ <br>

  <br>

    if ( ch == EOF ) <br>

  <br>

    { <br>

  <br>

        return( -1 ); <br>

  <br>

    } <br>

  <br>

  <br>

  <br>

    *cmd = ( char )ch; <br>

  <br>

        return( 0 ); <br>

  <br>

    } <br>

  <br>

    i = 0; <br>

  <br>

  <br>

    while ( !isspace( ch ) ) <br>

  <br>

    { <br>

  <br>

        if ( ++i > MAXWORD ) <br>

  <br>

        { <br>

  <br>

            printf( "error: word too long.\n" ); <br>

  <br>

            exit( 1 ); <br>

  <br>

        } <br>

  <br>

        *word++ = ch; <br>

  <br>

[scz@ /home/scz/src]> strip rdict <br>

  <br>

[scz@ /home/scz/src]> ./rdict <br>

  <br>

Could not contact remote program. <br>

  <br>

  <br>

[scz@ /home/scz/src]> <br>

  <br>

  <br>

  <br>

★ 编译链接server程序 <br>

  <br>

  <br>

  <br>

[scz@ /home/scz/src]> cat > rdict_sif.c <br>

  <br>

[scz@ /home/scz/src]> gcc -O3 -o rdict_sif.o -c rdict_sif.c <br>

  <br>

  <br>

  <br>

/* rdict_srp.c -- initw, insertw, deletew, lookupw */ <br>

  <br>

  <br>

  <br>

#include <rpc/rpc.h> <br>

  <br>

  <br>

  <br>

  <br>

#include "rdict.h" <br>

  <br>

  <br>

  <br>

/* Server-side remote procedures and the global data they use */ <br>

  <br>

  <br>

  <br>

char dict[ DICTSIZ ][ MAXWORD + 1 ];  /* storage for a dictionary of <br>

  <br>

words */ <br>

  <br>

int  nwords = 0;                      /* number of words in the <br>

  <br>

dictionary */ <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * initw -- initialize the dictionary to contain no words at all <br>

  <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int initw ( void ) <br>

  <br>

{ <br>

  <br>

    nwords = 0; <br>

  <br>

    return 1; <br>

  <br>

}  /* end of initw */ <br>

  <br>

  <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * insertw -- insert a word in the dictionary <br>

  <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int insertw ( const char * word ) <br>

  <br>

{ <br>

  <br>

    strcpy( dict[nwords], word ); <br>

  <br>

    nwords++; <br>

  <br>

    return( nwords ); <br>

  <br>

/* ------------------------------------------------------------------ <br>

  <br>

 * lookupw -- look up a word in the dictionary <br>

  <br>

 * ------------------------------------------------------------------ <br>

  <br>

  <br>

*/ <br>

  <br>

  <br>

  <br>

int lookupw ( const char * word ) <br>

  <br>

{ <br>

  <br>

    int i; <br>

  <br>

    for ( i = 0; i < nwords; i++ ) <br>

  <br>

    { <br>

  <br>

        if ( strcmp( word, dict[i] ) == 0 ) <br>

  <br>

        { <br>

  <br>

            return( 1 ); <br>

  <br>

        } <br>

  <br>



    }  /* end of for */ <br>

  <br>

    return( 0 ); <br>

  <br>

}  /* end of lookupw */ <br>

  <br>

  <br>

  <br>

[scz@ /home/scz/src]> cat > rdict_srp.c <br>

  <br>

[scz@ /home/scz/src]> gcc -O3 -o rdict_srp.o -c rdict_srp.c <br>

  <br>

[scz@ /home/scz/src]> gcc -O3 -o rdictd rdict_srp.o rdict_svc.o <br>

  <br>

rdict_xdr.o rdict_sif.o <br>

--- <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="559.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -