ICE参数传递分析

原创 2006年05月21日 16:52:00

ICE参数传递分析

       ICE由于涉及到不同进程甚至不同主机间的调用,所以需要对参数做些处理,下面以ICE自带的例子printer,并为他加入几个类型和函数进行分析。

 

       ICE为每个内置类型在IceInternal::BasicStream中写了readwrite函数,为stringvector<string>vector<T>也写了readwrite函数。如果参数类型为以上类型那么就直接使用。如果参数类型为复杂的STL类型,如vector< vector<string> >ICE在编译ice接口文件时会为该类型生成一对__read__write函数。如果内部使用了结构体,那么编译ice接口文件时会为该结构体生成一对__read__write函数,这两个函数将内部成员分别调用IceInternal::BasicStream中的readwrite函数。

 

       参数类型分三种,输入、输出和返回,但是返回和输出基本一样。

输入参数

结构体

       简单结构体为只有内置类型的机构体。ICE通过ice接口文件为结构体添加两个函数__read__write,读和写都通过这两个函数进行。这两个函数在调用IceInternal::BasicStream里每个基本类型的readwrite函数写到缓冲中。

 

string型输入参数

       下面以printString为例说明

l         客户端调用printString

l         调用IceProxy空间的printString函数

l         调用IceProxy空间的带Ice::ContextprintString函数

l         调用IceDelegateM空间的printString函数

l         调用IceInternal::BasicStream::write(string&),该函数会先写大小到缓冲区,然后将所有数据拷贝到缓冲区中,并改变缓冲区的位置。

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间的__printString函数

l         调用IceInternal::BasicStream::read,该函数会先读取大小,然后通过一个临时的string对象交换到string

 

vector<string>型输入参数

下面以printArray为例说明

l         客户端调用printArray

l         调用IceProxy空间的printArray函数

l         调用IceProxy空间的带Ice::ContextprintArray函数

l         调用IceDelegateM空间的printArray函数

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间的__printArray函数

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

vector< vector<string> >型输入参数

下面以printArray为例说明

l         客户端调用printArray

l         调用IceProxy空间的printArray函数

l         调用IceProxy空间的带Ice::ContextprintArray函数

l         调用IceDelegateM空间的printArray函数

l         调用由ice接口文件生成的__write函数,先写vector的个数,然后依次调用IceInternal::BasicStream::write(vector<string> &)函数

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间的__printArray函数

l         调用由ice接口文件生成的__write函数,先读vector的个数,然后依次调用IceInternal::BasicStream::read(vector<string> &)函数

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

输出参数

string型输出参数

       getString为例说明

l         调用IceProxy空间的getString函数

l         调用IceProxy空间的带Ice::ContextgetString函数

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间___getString

l         实际调用具体的getString函数

l         调用IceInternal::BasicStream::write(string&),该函数会先写大小到缓冲区,然后将所有数据拷贝到缓冲区中,并改变缓冲区的位置。

 

l         返回到客户端

l         调用IceInternal::BasicStream::read,该函数会先读取大小,然后通过一个临时的string对象交换到string

 

vector<string>型输出参数

       getArray为例说明

l         调用IceProxy空间的getArray函数

l         调用IceProxy空间的带Ice::ContextgetArray函数

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间___getArray

l         实际调用具体的getArray函数

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

l         返回到客户端

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

 

vector< vector<string> >型输出参数

       getTable为例说明

l         调用IceProxy空间的getTable函数

l         调用IceProxy空间的带Ice::ContextgetTable函数

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间___getTable

l         实际调用具体的getTable函数

l         调用由ice接口文件生成的__write函数,先写vector的个数,然后依次调用IceInternal::BasicStream::write(vector<string> &)函数

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

l         返回到客户端

l         调用由ice接口文件生成的__write函数,先读vector的个数,然后依次调用IceInternal::BasicStream::read(vector<string> &)函数

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

 

 

14.0 zero ice 属性配置

配置属性         通过配置文件,我们可以设置Ice程序各个方面的应用,但是Ice只会在创建通信器时读入属性配置, 然后Ice在运行时能够识别配置文件中规定的属性集。 若要设置属性的话,必须在创...
  • xiaoliuliu2050
  • xiaoliuliu2050
  • 2016年11月24日 11:37
  • 396

(1)从ICE的对象讲起

通信实体、通信信息、链路传输从网络节点层面看,网络中的通信实体是以计算机为单位。从tcp编程的角度看,通信实体是以socket为单位。从ice的角度看,通信实体以对象为单位。ice认为分布式系统是由对...
  • chanshimudingxi
  • chanshimudingxi
  • 2016年03月19日 15:42
  • 416

ICE简单介绍及使用示例

转载自:http://blog.csdn.net/fenglibing/article/details/6372444 1、ICE是什么?  ICE是ZEROC的开源通信协议产品,它的全称...
  • u012377333
  • u012377333
  • 2015年06月01日 16:48
  • 2343

第二周 项目1-C/C++语言中函数参数传递的三种方式

问题及代码: /* * Copyright (C) 2016, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称 : bigice.cpp * ...
  • big_ice
  • big_ice
  • 2016年09月06日 18:07
  • 808

ICE学习(六)-Slice语言介绍

Slice语言介绍 Slice (Specification Language for Ice)语言建立了一种服务器和客户端之间的契约,他描述了接口和数据类型。这种描述和语言无关,因此,客户端和服务...
  • kaede999
  • kaede999
  • 2014年09月17日 09:30
  • 1757

很不多的ICE架构入门学习例子-ping程序

虽然使用传统的SOCKET编程,我们可以更为清楚程序的性能,能够更直接的操控SOCKET的设置,比如发送超时时间,接受BUFFER的大小,以及进行自己的协议加密。但是由于其调试成本较高,且不易于分布式...
  • educast
  • educast
  • 2013年07月19日 10:40
  • 916

ICE的工具集基本功能

1、为了能够生成一个全局的唯一标示,主要用来在adapter注册servant的时候需要ID,可以通过该方法获得一个     string IceUtil::generateUUID() 2、工具...
  • followshake
  • followshake
  • 2012年03月24日 16:06
  • 5483

ICE的属性设置

1、ICE的属性即"name=value"值,具体的name范畴可以见后续描述。可以在程序中设置属性值到ICE的运行环境中    但一定要注意在Communicator::Initialize方法调...
  • followshake
  • followshake
  • 2012年03月24日 22:38
  • 2864

ICE的属性配置

本文介绍了如何通过命令行参数或配置文件设置ICE的行为 在前一篇 文章中,大家可能都注意到了一个细节,Ice的初始化函数initialize 的输入参数正好是主函数的输入参数,也就是命令行参数(...
  • zhiweiarm
  • zhiweiarm
  • 2013年02月05日 11:07
  • 894

IceGrid搭建--继承IceBox.Service版

1.总括 2.概念描述 1.register 2.node 3.icebox 3.部署 1.model.ice [["java:package:co...
  • qq_31678877
  • qq_31678877
  • 2016年11月02日 16:37
  • 1104
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ICE参数传递分析
举报原因:
原因补充:

(最多只允许输入30个字)