📄 566.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="567.htm">下一篇</a>]
<hr><p align="left"><small>发信人: cloudsky (小四), 信区: Security <br>
标 题: RPC/XDR/NFS系列之----外部数据表示 <br>
发信站: 武汉白云黄鹤站 (Wed Feb 23 17:30:01 2000), 站内信件 <br>
<br>
标题:RPC/XDR/NFS系列之----外部数据表示 <br>
<br>
原作:Douglas E. Comer & David L. Stevens <br>
<< Internetworking With TCP/IP Vol III >> <br>
<br>
概述: <br>
<br>
本文针对RPC编程中涉及到的XDR做一介绍 <br>
<br>
测试: <br>
<br>
RedHat6.0 <br>
<br>
目录: <br>
<br>
★ 计算机中的数据表示 <br>
★ 网络字节顺序 <br>
★ 外部数据表示事实上的标准 <br>
★ XDR定义的数据类型 <br>
★ 没有类型信息 <br>
★ xdrmem_create函数(原文有误) <br>
★ XDR库中的转换例程(Redhat) <br>
★ xdrstdio_create函数 <br>
★ xdrrec_create函数,XDR流与UDP socket <br>
★ 相关RFC以及参考资料 <br>
<br>
★ 计算机中的数据表示 <br>
<br>
我们在DOS年代里常常提到一个字眼,反向字节存储,意思是高字节存储在 <br>
高地址,低字节存储在低地址,既然如此为什么还要叫反向字节存储呢, <br>
因为从屏幕显示效果来看,是反的,比如在debug下用d命令显示内存区域 <br>
的时候,低地址是从左边开始递增的。现在我们不用这么含混的叫法, <br>
在socket编程中有两个术语,big endian和little endian,后者对应目前 <br>
Intel X86架构,也就是所谓的反向字节存储(以后不再使用这个称呼)。 <br>
<br>
★ 网络字节顺序 <br>
<br>
以前在socket编程中使用的htons系列函数,解决了简单整数在网络传输以 <br>
及异构主机之间的表示问题。这里将要介绍的XDR远比htons系列函数复杂。 <br>
<br>
★ 外部数据表示事实上的标准 <br>
<br>
Sun Microsystems 公司的XDR(eXternal Data Representation)规定了在网络 <br>
上传输数据时如何表示成公共形式,这是C/S应用事实上的标准。XDR规定了 <br>
client和server所交换的大多数数据类型的外部表示,比如32bit整数采用 <br>
big endian。 <br>
<br>
★ XDR定义的数据类型 <br>
<br>
数据类型 大小 描述 <br>
<br>
int 32bit 32bit signed int <br>
unsigned int 32bit 32bit unsigned int <br>
bool 32bit 0 or 1(false or true) <br>
enum 任意 枚举型,值为整数 <br>
(如,RED=1,WHITE=2,BLUE=3) <br>
hyper 64bit 64bit signed int <br>
unsigned hyper 64bit 64bit unsigned int <br>
float 32bit 单精度浮点数 <br>
double 64bit 双精度浮点数 <br>
opaque 任意 不做任何转换,直接采用发送方本地表示 <br>
string 任意 ASCII字符串 <br>
fixed array 任意 任何其他数据类型的定长数组 <br>
counted array 任意 <br>
structure 任意 比如C的struct <br>
discriminated union 任意 比如C的union <br>
void 0 如果数据项是可选的,却又没有给出数据, <br>
就使用该类型 <br>
symbolic constant 任意 符号常量,比如C的#define <br>
optional data 任意 允许某一项出现零次或一次 <br>
<br>
XDR支持结构数组,所以实际上XDR能够表示大多数C语言的数据类型。 <br>
<br>
★ 没有类型信息 <br>
<br>
XDR规定了对一个数据对象如何编码,但编码中没有类型信息,所以client和 <br>
server使用XDR时,必须就其交换报文的确切格式达成一致,否则接收方无法 <br>
解码。 <br>
<br>
★ xdrmem_create函数(原文有误) <br>
<br>
在/usr/include/rpc/xdr.h中有如下定义: <br>
<br>
/* XDR using memory buffers */ <br>
extern void xdrmem_create __P ((XDR *__xdrs, __const caddr_t __addr, <br>
u_int __size, enum xdr_op __xop)); <br>
extern bool_t xdr_int __P ((XDR *__xdrs, int *__ip)); <br>
<br>
/* <br>
* Xdr operations. XDR_ENCODE causes the type to be encoded into the <br>
* stream. XDR_DECODE causes the type to be extracted from the stream. <br>
* XDR_FREE can be used to release the space allocated by an XDR_DECODE <br>
* request. <br>
*/ <br>
enum xdr_op { <br>
XDR_ENCODE = 0, <br>
XDR_DECODE = 1, <br>
XDR_FREE = 2 <br>
}; <br>
<br>
该函数初始化一块很大的内存缓冲区,用于进行XDR转换。 <br>
<br>
#include <rpc/xdr.h> <br>
#define BUFSIZE 4000 /* size of memory for encoding */ <br>
<br>
XDR * xdrs; /* pointer to an XDR stream */ <br>
char buf[BUFSIZE]; /* memory area to hold XDR data */ <br>
<br>
xdrmem_create( xdrs, buf, BUFSIZE, XDR_ENCODE ); <br>
<br>
一旦程序创建了一个XDR流,就可以调用各种XDR转换例程。每种例程编码对应类型 <br>
的数据对象,并将编码后的数据追加到流的末尾,同时更新内部的XDR流指针。 <br>
<br>
int i; /* integer in native representaion */ <br>
... ... <br>
i = 260; <br>
xdr_int( xdrs, &i ); /* convert integer and append to stream */ <br>
<br>
-------------------------- <br>
^ | <br>
------------|------------------------------------------------------ <br>
| XDR流首部·| 0 | 1 | 2 | 3 | 4 | 5 | 6 | | <br>
------------------------------------------------------------------- <br>
<br>
------------------------------------------ <br>
^ | <br>
------------|------------------------------------------------------ <br>
| XDR流首部·| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 0 | 1 | 0 | 4 | | <br>
------------------------------------------------------------------- <br>
<br>
scz注:P189(第2版 vol III)原图有误。260 = 0x0104,XDR对于32bit int <br>
使用big endian序。 <br>
<br>
<br>
-- <br>
我问飘逝的风:来迟了? <br>
风感慨:是的,他们已经宣战。 <br>
我问苏醒的大地:还有希望么? <br>
大地揉了揉眼睛:还有,还有无数代的少年。 <br>
我问长空中的英魂:你们相信? <br>
英魂带着笑意离去:相信,希望还在。 <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="567.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 + -