📄 554.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="555.htm">下一篇</a>]
<hr><p align="left"><small>发信人: cloudsky (小四), 信区: Security ;32mWWW-POSTm <br>
标 题: RPC/XDR/NFS系列之----RPC编程初战(1) <br>
发信站: 武汉白云黄鹤站 (Sun Feb 20 11:40:23 2000) , 站内信件 <br>
标题:RPC/XDR/NFS系列之----RPC编程初战(1) <br>
<br>
<br>
<br>
原 作:Douglas E. Comer & David L. Stevens <br>
<br>
<< Internetworking With TCP/IP Vol III >> <br>
<br>
整理修改:scz < mailto: cloudsky@263.net > <br>
<br>
<br>
<br>
概述: <br>
<br>
<br>
<br>
所有关于原理的部分以后再贴,这里直奔程序设 <br>
<br>
计而去。文章中的程序就是书中的程序,但原文 <br>
<br>
<br>
针对Xinu系统来的,要不就针对Sun RPC来的, <br>
<br>
<br>
<br>
我这里只有Redhat,改动是一定的,在后面的小 <br>
<br>
节里我会指出改动过的地方。完整地演习过这个 <br>
<br>
系列,你就不在畏惧RPC。计划在后面的灌水中 <br>
<br>
讲述RPC远程过程调用发生缓冲区溢出的原理, <br>
<br>
不过仅仅是计划,要看时间是否允许。 <br>
<br>
<br>
<br>
下面的程序完成一个字典的常规维护工作,代码 <br>
<br>
很简单,让我们开始。 <br>
<br>
<br>
<br>
<br>
测试: <br>
<br>
<br>
<br>
RedHat6.0测试,如果在solaris下,应该更容易实现, <br>
<br>
因为Sun RPC是事实上的标准,rpcgen是Sun自己的工 <br>
<br>
具嘛。 <br>
<br>
<br>
<br>
目录: <br>
<br>
<br>
<br>
★ 构建一个解决问题的常规应用程序 <br>
<br>
★ 将该常规程序划分成两部分 <br>
<br>
★ 创建一个rpcgen规格说明 <br>
<br>
<br>
★ 运行rpcgen <br>
<br>
★ rpcgen产生的.h文件 <br>
<br>
★ rpcgen产生的XDR转换文件 <br>
<br>
★ rpcgen产生的client代码 <br>
<br>
★ rpcgen产生的server代码 <br>
<br>
★ 编写stub接口过程 <br>
<br>
★ 编译链接client程序 <br>
<br>
★ 编译链接server程序 <br>
<br>
★ 启动服务器执行客户机 <br>
<br>
★ 分离服务器和客户机 <br>
<br>
★ rpcinfo的使用以及portmap原理简介(重要) <br>
<br>
<br>
★ RPC程序编译开关 <br>
<br>
★ RPC编程小结 <br>
<br>
<br>
<br>
★ 构建一个解决问题的常规应用程序 <br>
<br>
<br>
<br>
下面这个程序很简单,实现一个字典的简单维护工作,不多解释了。 <br>
<br>
<br>
<br>
/* dict.c -- main, initw, nextin, insertw, deletew, lookupw */ <br>
<br>
<br>
<br>
#include <stdlib.h> <br>
<br>
#include <stdio.h> <br>
<br>
<br>
#include <ctype.h> <br>
<br>
#include <string.h> <br>
<br>
<br>
<br>
#define MAXWORD 50 /* maximum length of a command or word */ <br>
<br>
#define DICTSIZ 100 /* maximum number of entries in dictionary. */ <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>
<br>
int nextin ( char * cmd, char * word ); <br>
<br>
int initw ( void ); <br>
<br>
int insertw ( const char * word ); <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>
<br>
int main ( int argc, char * argv[] ) <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>
printf( "Please input:\n" ); <br>
<br>
while ( 1 ) <br>
<br>
{ <br>
<br>
<br>
wordlen = nextin( &cmd, word ); <br>
<br>
if ( wordlen < 0 ) <br>
<br>
{ <br>
<br>
exit( 0 ); <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>
<br>
case 'i': /* 插入 */ <br>
<br>
insertw( word ); <br>
<br>
printf( "%s inserted.\n", word ); <br>
<br>
break; <br>
<br>
case 'd': /* 删除 */ <br>
<br>
<br>
<br>
if ( deletew( word ) ) <br>
<br>
{ <br>
<br>
printf( "%s deleted.\n", word ); <br>
<br>
} <br>
<br>
else <br>
<br>
<br>
{ <br>
<br>
printf( "%s not found.\n", word ); <br>
<br>
} <br>
<br>
break; <br>
<br>
case 'l': /* 查询 */ <br>
<br>
if ( lookupw( word ) ) <br>
<br>
{ <br>
<br>
printf( "%s was found.\n", word ); <br>
<br>
} <br>
<br>
else <br>
<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>
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>
<br>
} /* end of while */ <br>
<br>
return 0; <br>
<br>
} /* end of main */ <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>
<br>
int i, ch; <br>
<br>
ch = getc( stdin ); <br>
<br>
while ( isspace( ch ) ) <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>
<br>
*word++ = ch; <br>
<br>
ch = getc( stdin ); <br>
<br>
} /* end of while */ <br>
<br>
*word = '\0'; /* 原来的代码这里有问题 */ <br>
<br>
return i; <br>
<br>
} /* end of nextin */ <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>
<br>
<br>
int insertw ( const char * word ) <br>
<br>
{ <br>
<br>
strcpy( dict[nwords], word ); <br>
<br>
nwords++; <br>
<br>
return( nwords ); <br>
<br>
} /* end of insertw */ <br>
<br>
<br>
<br>
/* ------------------------------------------------------------------ <br>
<br>
* deletew -- delete a word from the dictionary <br>
<br>
<br>
* ------------------------------------------------------------------ <br>
<br>
*/ <br>
<br>
<br>
<br>
int deletew ( 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>
nwords--; <br>
<br>
<br>
strcpy( dict[i], dict[nwords] ); <br>
<br>
return( 1 ); <br>
<br>
} <br>
<br>
} /* end of for */ <br>
<br>
return( 0 ); <br>
<br>
} /* end of deletew */ <br>
<br>
<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>
word2 inserted. <br>
<br>
i word3 <br>
<br>
word3 inserted. <br>
<br>
l word2 <br>
<br>
word2 was found. <br>
<br>
d word2 <br>
<br>
word2 deleted. <br>
<br>
<br>
l word2 <br>
<br>
word2 was not found. <br>
<br>
qq < -- -- -- 问题同上,请仔细阅读nextin()函数的代码 <br>
<br>
Program quits. <br>
<br>
[scz@ /home/scz/src]> <br>
<br>
<br>
<br>
现在我们拥有了一个解决的的常规程序,该程序不是分布式的。 <br>
<br>
<br>
<br>
-- <br>
<br>
;34m※ 来源: 武汉白云黄鹤站 bbs.whnet.edu.cn. [FROM: 202.106.243. <br>
<br>
213] m <br>
<br>
-- <br>
<br>
<br>
<br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="555.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 + -