ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

代理和存根

2022-03-01 18:35:21  阅读:173  来源: 互联网

标签:代理 Stub RPC 存根 Proxy COM


1、概念

(1)代理和存根

代理和存根在COM,RPC等方面使用。

列集marshaling

列集,对函数参数进行打包处理得过程,因为指针等数据,必须通过一定得转换,才能被另一组件所理解,列集完成后,RPC调用就会产生。可以说列集是一种数据格式的转换方法。

//列集有3种方式:
1. 类型库列集
  它可以列集与OLEAUTOMATION兼容的任何接口,意思是你的接口的返回值必须是HRESULT,所使用的参数的类型也应该是与C++的VARIANT结构兼容。
2. 通过创建Stub / proxy DLL
  这个DLL的源代由MIDL产生。你必须在服务器和客户机上都注册这个DLL(这是标准的marshal 方式)使用吃方法时,最好把stub / proxy代码编译作为一个独立的组件。
3. 自定义marshaling
  自定义marshal要求在你的组件中必须实现IMarshal接口。当COM需要marchal时,他首先通过QueryInterface看你是否支持IMarshal接口,如果你实现了该接口,也就是说,由你控制了你的COM的所有参数和返回值的打包、解包的方法模式。

代理和存根dll的建立

使用工具MIDL,对一个IDL文件,MIDL会分析自动产生相应的代理/存根DLL的相关文件。

怎么使用代理和存根?

对于你来说代理和存根的使用是透明的,你根本不用去关心如何使用他们,com库会知道怎么做。

(2)COM

(3)RPC

RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地资源一样,通过网络传输去访问远端系统资源。(此段百度的,不管来自哪儿,弄明白就是自己的)

类厂(类工厂)

c++下,创建对象必须知道对象的类别,然后才能比如new一个出来。
而com下,你不知道组件的实际的类别,你只知道abstract class,也就是com接口,所以你不能创建。
但是客户并不关心实际的类别,只关心接口,
所以有必要引入一个间接的创建机制,让它来创建,这就是类厂,这是通用的设计模式。

2、问题:COM的RPC为什么一定要使用Proxy和Stub?不能像Socket一样直连客户端和服务器吗?

在COM架构中调用者和被调用者如果在不同的套间,就不可以直接调用,而必须通过代理(Proxy)和占位(Stub)程序调用,通过Proxy和Stub之间的通讯来完成调用者和被调用者之间的调用,
即:`Server -- Stub -- Network --- Proxy --- Client`,
我的疑问是直接通过`Server -- Network --- Client`能实现吗?为什么一定要使用Proxy和Stub?

客户为什么要用代理和存根,而不直接同对象连接呢?

给你一个理由,对客户来说,他与所有com对象的连接都是通过指针来调用的, 而对服务来说,调用对象的接口函数也是通过指针来完成的,然而,指针只有在同一进程内才会有效。这样,代理和存根为了完成这个使命也就产生了。

代理和存根的作用不只这些,他还要打包所有的参数(包括接口指针),产生RPC(远程进程调用),通向另一个进程,或者对象运行所在的另一台机器。

回答1【采用】

原因1:COM要实现位置透明性
RPC是指远程过程调用,COM之所以要用Proxy/Stub,而不用WinSocket等通信手段直接通信是因为COM要实现位置透明性,即客户不需要知道服务器在哪。

原因2:封装需要
另一个重要原因是因为封装需要,客户如果和服务器直接通信,那么他们之间就得建立一个协议,指明参数的传递格式,用什么加密手段加密,公钥是什么等,这有违服务器的封装性,而且也留有严重的安全隐患(因为会话是由客户和服务器共同建立的,而客户和服务器并不是同一组织编写,客户方可以留下漏洞),而使用Proxy/Stub,Proxy和Stub都是编写服务器的组织编写的,留下漏洞的原因就只能是那个组织水平有限。

回答2

楼主的意思可能是用COM来通讯为什么不是和Socket通讯一样直接连接而要通过代(Proxy)和(Stub)

COM在这里应该认为是DCOM最后也是要走Socket的,只是这些DCOM都帮你做好了,所以你不用自己写一个Socket来RPC一下,他让你感觉服务器就在本机上一样。

不是说COM不能做Socket,用COM和做Socket没有什么关系。

回答3

我说得很清楚了,数据当然是靠RPC来传的
但是只有代理/存根dll知道把传来的数据包unmarshal成什么东西

如果没有proxy/stub
那么server怎么知道client传来的是什么东西,同样client也不知道server传来的是什么东西

参考:
https://www.jianshu.com/p/d93d0a11f556
https://bbs.csdn.net/topics/30442941

标签:代理,Stub,RPC,存根,Proxy,COM
来源: https://www.cnblogs.com/sybil-hxl/p/15951733.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有