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

📄 566.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="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 + -