第十一章 数据结构的传输和XDR标准
·11.1 数据结构的传送
网络数据结构传递可能存在以下问题:网络字序问题、浮点数传输、指针处理
自定义手工处理方式:
将待发送数据结构转换以后放入应用的发送缓冲区;
将应用的接收缓冲区中数据结构转换以后再进行数据处理。
代码示例:
void send_int32_2buf(char *buf, unit32_t n)
{
n = htonl(n);
bcopy((char *)&n, buf, sizeof(unit32_t));
}
void send_string_2buf(char *buf, char*str);
{
bcopy(str, buf, strlen(str));
}
void send2_buf(char *buf, struct u_data *ptr)
{
send_int32_2buf(buf, ptr->aInt);
buf += sizeof(unit32_t);
send_string_2buf(buf, ptr->str);
buf += strlen(ptr->str); // * sizeof(char)
}
void recv_int32_from(char *buf, unit32_t *n)
{
bcopy(buf, (void*)n, sizeof(unit32_t));
*n = ntohl(*n);
}
void recv_from_buf(char *buf, struct u_data *ptr)
{
recv_int32_from_buf(buf, &(ptr->aInt));
buf += sizeof(uint32_t);
}
·XDR标准和实现原理
XDR数据结构传输标准是SUN公司设计的,已经成为大多数客户机/服务器应用中的事实上的标准。
XDR对各种数据类型规定了编码方式。初始化函数是
#include <rpc/xdr.h>
extern void xdrmem_create((XDR *xdrs, const caddr_t addr, u_int size, enum xdr_op xop)); //xdrs是创建后XDR流指针,addr是存放XDR流发送缓冲区
XDR的流转换方式和上面自定义方式类似,但是对各种数据类型的处理做了统一规定。应用程序设计配对的接收和发送,分别处理每个数据项。
XDR有内存流和I/O流两种。可以使用内存流,进行套接字缓冲区间的数据结构传输;使用I/O流将编解码的结果输出到文件流中。
XDR和TCP都是流的抽象,所以两者可以很好结合。另外XDR提供了面向记录的XDR抽象,应用在UDP传输。
XDR转化函数所做操作决定于XDR流本身性质。如果XDR是编码流时,转化函数就做数据编码,如果是解码流时,转换函数就做数据解码。
第十二章 RPC远程过程调用原理和实现
·RPC的原理
使用XDR协议可以让数据结构无差别的在网络传输,使用RPC(remote procedure call)远程过程调用可以使函数在不同主机上运行。RPC所要达到目的是将网络通信功能和应用的需求分开。
RPC的中心是优先考虑应用的分析,在模块功能划分完毕后将其分离出来。这些模块在不同主机上运行,RPC保证模块分离前后的语义不变。
函数调用的4个原则:
1 把函数所需参数准备好,通过某种方式可以让调用函数访问到。
2 必须包含函数的返回信息
3 能够确定调用函数的位置
4 为调用函数创建可以运行的环境
其中“本地调用”这是上述四个原则的一种实现,1 通过堆栈段 2 函数返回地址 3 PC指针指向函数入口地址 4 局部变量在函数栈分配,其他数据共享进程数据段
RPC远程调用模拟本地调用:
我们可以使用定义好的信息格式保存调用过程参数,在信息格式中说明如何去找被调用者(通常是某种标志)。然后通过网络将信息报文发送到被调用所在机器上,然后调用者等待被调用方发回的调用结果。 【条件1和3】
被调用主机上应有一个分派器控制所有远程调用过程。收到报文后通过其中的标志知道需要调用哪个,取出被调用者需要的参数然后传入。【条件2】
被调用过程在它所在环境中运行,并将运行结果写在信息格式中,最后网络将调用结果返回。【条件4】
·RPC的实现
远程过程标示:(程序号,远程调用过程版本号,远程过程序号)
端口的动态映射:每一个远程调用过程都对应占用一个有操作系统动态分配的传输层端口。调用方需要调用一个远程调用过程,它会向端口映射器发送一个请求,然后端口映射器通过查表返回相应远程调用过程的端口号。然后它向远程调用过程发起调用请求。
RPC的报文:RPC使用XDR语言定义应用的报文。
RPC开发工具:由于ONC RPC协议规程非常复杂,因此系统提供了专门用于开发RPC的工具。注意包括:XDR库函数,RPC运行时间库函数,一些程序的自动生成工具,产生一个构件RPC分布式程序需要的C程序文件,这些程序主要是屏蔽底层通信对应用的影响。
客户端主要实现:
向端口映射器发送请求,并从端口映射器接收回应;形成CALL报文,向真正的远程调用过程发送调用请求,接收来自服务器的调用结果。
服务器段主要实现:
在提供服务之前向端口映射器注册自己实际端口;将一个调用分派到具体调用程序中的一个调用过程。
·RPC的实现
远程过程标示:(程序号,远程调用过程版本号,远程过程序号)
端口的动态映射:每一个远程调用过程都对应占用一个有操作系统动态分配的传输层端口。调用方需要调用一个远程调用过程,它会向端口映射器发送一个请求,然后端口映射器通过查表返回相应远程调用过程的端口号。然后它向远程调用过程发起调用请求。
RPC的报文:RPC使用XDR语言定义应用的报文。
RPC开发工具:由于ONC RPC协议规程非常复杂,因此系统提供了专门用于开发RPC的工具。注意包括:XDR库函数,RPC运行时间库函数,一些程序的自动生成工具,产生一个构件RPC分布式程序需要的C程序文件,这些程序主要是屏蔽底层通信对应用的影响。
客户端主要实现:
向端口映射器发送请求,并从端口映射器接收回应;形成CALL报文,向真正的远程调用过程发送调用请求,接收来自服务器的调用结果。
服务器段主要实现:
在提供服务之前向端口映射器注册自己实际端口;将一个调用分派到具体调用程序中的一个调用过程。