可扩展性

传输

对于前一个版本的RCF,一个(应得的)批评是关于它和TCP协议过度紧密的关系。现在RCF采用了传输无关的设计,并且对于初用者,可以使用它支持的TCP和UDP协议。更重要的是,它的架构很容易支持第三方开发自己的客户端/服务器端的传输。在客户端,I_ClientTransport基类给客户端调用提供了钩子。在服务器端,需要写一个服务。

RcfServer服务

RcfServer通过服务的概念来容纳第三方扩展。当服务器开始和停止时,这些服务将会被通知到,服务也可以在服务器运行时被动态添加和移除。一个典型的服务可能是绑定一个对象到服务器的接口,请求服务器创建一个线程然后做一些定期的活动。

服务器的传输就是以服务的形式实现的,所以一个RcfServer对象可以拥有多个传输。一些可用的服务如下:

l         ObjectFactoryService:允许客户端在服务器端创建对象

l         FilterService:允许服务器为了响应客户端的请求而动态加载过滤器

l         PublishingService:使能服务器的发布功能

l         SubscriptionService:使能服务器的订阅功能

I_Service是所有服务的基类,在相关文档里有描述。查看前面提到的服务的源代码,从而来了解I_Service如何实现的。

可移植性

编译器

RCF 0.4已经在Visual C++ 7.1, Visual C++ 8.0, gcc 3.x, Borland C++ 5.6, 和Metrowerks CodeWarrior 9.2上面测试过。另外,RCF 0.9c支持在Visual C++ 6.0和gcc 2.95上编译。

平台

RCF的服务器实现是基于Win32的I/O完成端口(completion port)的,所以限制在了Windows2000和以后的版本。TCP的客户端和UDP客户端/服务器端都是基于BSD套接字实现的,所以具有很好的移植性。在非Windows平台上(Windows上可选的),RCF利用asio库来实现TCP服务器。

编译

一般来说,为了编译使用RCF的应用程序,你需要在你的应用程序代码里包含src/RCF/RCF.cpp。你还会需要Boost库的头文件(最近的任何版本应该都可以)。如果你打算用Boost.Serialization,你需要1.31.0或者更新的版本。

可以用一些预编译符号(preprocessor symbols)来控制RCF哪些部分将被编译。这些符号需要在全局定义,比如在工程的设置里定义而不是定义在代码里。

l         RCF_USE_BOOST_THREADS:利用Boost线程库mutex和线程创建功能。如果没有定义,RCF将不再是线程安全的。

l         RCF_USE_BOOST_READ_WRITE_MUTEX:利用1.32.0版本的Boost库的读/写mutex。如果没有定义,将使用一个简单的替代。只有当RCF_USE_BOOST_THREADS定义时才有效。

l         RCF_USE_ZLIB:编译对Zlib压缩的支持。

l         RCF_USE_OPENSSL:编译对OpenSSL加密(过滤器)的支持。

l         RCF_USE_BOOST_SERIALIZATION:编译对Boost.Serialization库的支持。

l         RCF_USE_SF_SERIALIZATION:编译对RCF内建的序列化框架的支持。如果RCF_USE_BOOST_SERIALIZATIONRCF_USE_SF_SERIALIZATION都没有被定义,RCF_USE_SF_SERIALIZATION将会被自动定义。

l         RCF_NO_AUTO_INIT_DEINIT:禁止RCF的自动初始化和反初始化功能。如果定义了,用户需要在适当的时间显示地调用RCF::init()RCF::deinit()。特别地,当把RCF编译成DLL时,需要去定义这个预编译符号,从而防止过早地初始化。

总的来说,对第三方库的依赖(Boost.ThreadsBoost.SerializationZlibOpenSSL)是可选的。编译这些库的说明已经超出本篇文章的范围,但是如果你在编译Boost库时有困难,一个可行的方法是使用Boost的编译工具—bjam,然后编译相应的CPP文件到你的应用程序里。

例如,为了使用Boost.Threads库,你只要包含boost_root/libs/thread/src目录下的CPP文件到你的工程中。然后在boost_root/boost/thread/detail/config.hpp文件里定义一个合适的预编译符号(可能是BOOST_THREAD_USE_LIB)。

测试

在下载的目录里有个/test目录,里面有全面的测试代码,所有的代码都应该能够成功编译运行。这次测试代码应该能够用Boost.Build工具自动编译和运行,或者手动编译运行。这次测试代码不仅有我所描述的这些功能,对于用户来说也可以提供更多有用的信息。

反馈

这个库的现在和将来的形状和范围很大程度上都依赖我从用户那里得到的反馈。所以敬请发表你们的看法,欢迎任何的观点。你可以在这里提出问题,或者给我发email。

当然,我要感谢那些在前一个版本给出帮助的人。

历史

  • 2005-12-23 – 版本 0.1 发布
  • 2006-04-06 – 版本 0.2 发布

RCF现在可以在Linux,Solaris和Windows上编译运行,服务器端和客户端可以分布在多个平台上,并且可以无缝地通讯。

在非Windows平台上,为了使用RCF,asio网络库是首要必备的。下载asio并确保asio头文件对于你的编译器是可用的,在编译RCF时还要确保已经定义了RCF_USE_ASIO预编译符号。Asio库需要1.33.0或者更新的Boost库,为了避免Boost的依赖库,你可能需要定义BOOST_DATE_TIME_NO_LIB预编译符号。

RCF 0.2已经在下列编译器上进行了编译和测试:

  • gcc 3.2 (MinGW on Windows)
  • gcc 3.3 (Linux)
  • gcc 3.4 (Solaris)
  • Borland C++ 5.6
  • Metrowerks CodeWarrior 9.2
  • Microsoft Visual C++ 7.1
  • Microsoft Visual C++ 8.0

很多在这个论坛上报告的bug已经被修复了。

向那些等待这个版本发布的人道歉,我本来计划几个月之前发布的,但是由于繁忙的工作安排(还有一些难处理的测试例)干扰了版本的正常发布。对不起!

  • 2006-07-30 – 版本 0.3 发布
    • RCF对asio的支持已经从版本0.3.5升级到版本0.3.7,这个工作是David Bergman.完成的,谢谢David!
    • 去掉了对asion 0.3.5的支持。
    • 预编译符号由RCF_USE_ASIO变为RCF_USE_BOOST_ASIO
  • 2006-09-19 – 版本 0.4 发布
    • 64位兼容性: RCF可以编译和运行在64位的Solaris, Linux和Windows平台上。
    • 对于std::vector<T>的快速序列化。这里的T是原始类型 (char, int等)
    • 对于使用RCF来进行32位和64位系统见通讯,可以通过使用boost的typedef(boost::int32_t,boost::uint32_t, boost::int64_t, boost::uint64_t)来代替long和std::size_t,从而避免32位系统和64位系统之间的差异导致的序列化错误。

o        最后,感谢不伦瑞克技术大学的Sören Freudiger,感谢他借给我64位Linux机器的账号。

  • 2007-07-11 – 版本 0.9c 发布

    • RCF 0.9c是RCF 1.0的预发布版,现在可以从Google Code下载。随着一年多的开发,RCF 0.9c重新构建和升级了RCF 0.4。被用作一个主要的ECM平台的网络基础,RCF建立了自己的地位。
    • 使用RCF 0.4的应用程序升级到RCF 0.9c会有一些困难。如果你在升级到0.9c时候遇到任何认为,请随时和我联系。我会帮助你解决。
    • RCF 0.9c的特性有:
      • 为了快速和可伸缩的性能的零拷贝,零堆内存分配内核
      • SSPI过滤器,为了在Windows平台上,传输Kerberos和NTLM认证和加密
      • OpenSSL过滤器,为传输SSL认证和加密
      • 服务器端的多线程
      • 服务器端的会话对象
      • 内建的运行时版本识别, 为了前向和后向兼容
      • 健壮的发布订阅功能
      • 支持老的编译器,也就是Visual C++ 6, Borland C++ Builder 6和gcc2.95
      • 支持64位编译器
  • 2007-08-23 – 文章内容更新
  • 2008-04-28 – 版本 0.9d-P1 发布
    • RCF 0.9d-P1是RCF-0.9d的一个预览版。它在Windows上Visual C++编译器下(6.0, 7.1, 8.0, 9.0)经过全面的测试。RCF 0.9d发布版将包含对Linux和Solaris的全面支持,和以用户指导手册形式的丰富的文档。
    • 可以从Google Code的下载页面下载。
    • RCF 0.9d特性包括:
      • Win32的命名管道传输实现 (RCF::Win32NamedPipeEndpoint)
      • 不再需要Boost.Thread
      • UDP的多播和广播
      • SF序列化对boost::tuple, boost::variant 和boost::any 的支持
      • 支持从DLL导出RCF
      • 兼容Boost的最新版本 (1.35.0)和Boost.Asio (0.3.8+)版本
      • 与RCF 0.9c的兼容

许可

请注意:每个下载的代码都是独立的。对代码和文章的协议如下:

  • The article is licensed under The Code Project Open License (CPOL)
  • RCF 0.4 is licensed under the MIT license
  • RCF 0.9c and successors are licensed under the GPL license

关于作者

Jarl Lindrud

软件开发者,前瑞典居民,现在居住在澳大利亚的堪培拉。工作在分布式C++应用程序方面。作者喜欢程序设计,但更喜欢滑雪和乒乓球运动。别人提到他时他会感到非常大的满足。

RCF—用于C++的进程间通讯(4)相关推荐

  1. RCF—用于C++的进程间通讯(1)

    导言 RCF(Remote Call Framework,远程调用框架)是一个C++的框架.这个框架用来为实现C++程序进程间调用提供一个简单和一致(consistent)的方法.这个框架基于强类型的 ...

  2. RCF—用于C++的进程间通讯(3)

    过滤器(Filters) RCF通过过滤器的概念来支持对消息的压缩和加密.过滤器需要同时应用于服务器端和客户端.也可以被应用于传输层,例如应用SSL过滤器到向TCP这样基于流的传输:或者应用于独立的消 ...

  3. Android-Binder进程间通讯机制-多图详解

    本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据?​​​​​​​ 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...

  4. 管道实现进程间通讯 、WaitNamedPipe

    一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...

  5. linux open 头文件_linux下通过共享内存和mmap实现进程间通讯

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

  6. Android(IPC)进程间通讯1:详解Binder由来?

    完整原文:http://tryenough.com/android-... Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方 ...

  7. linux mmap实例_Linux下通过共享内存和mmap实现进程间通讯(含实例)

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

  8. Linux 进程间通讯方式 pipe()函数

    Linux 进程间通讯方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) 6-&g ...

  9. 进程间通讯SendMessage

    PostMessage貌似只能用于进程内通讯,不同进程间通讯可以用SendMessage和共享内存等方式.这里理出SendMessage的用法,方便日后查阅. 发送消息的进程代码: const UIN ...

最新文章

  1. web框架flask(12)——国际化和本地化
  2. matplotlib散点图,圆
  3. Android短信拦截2019,关于征集2019年度信息科学领域重大项目立项建议的通告
  4. rust军用船指令_Rust基础学习笔记(五):Cargo与Crates.io
  5. (转) RabbitMQ学习之spring整合发送同步消息(注解实现)
  6. 【多线程系列】之生产者消费者问题
  7. 如何找到稳定的网站空间
  8. WIN32汇编 菜单和加速键的使用
  9. C语言课程设计题目介绍(10个标准题目)
  10. 【最全】微信支付宝小程序蓝牙API开锁全流程
  11. 大数据丨网络爬虫技术总结
  12. SNMP Trap 报文
  13. SPSS入门教程—对数据进行去重操作的相关方法
  14. 数量关系--工程问题
  15. mac制作linux启动盘,Mac 下制作开机启动盘,做了一个Centos7 的系统U盘
  16. 计量单位报错:消息号BM302 “未使用语言 ZH 创建单位 XXX”
  17. ae制h5文字动画_html5酷炫的文字打字动画特效
  18. 【渝粤题库】广东开放大学 建筑测量 形成性考核
  19. 跳跃游戏(Java)
  20. 联想android模拟器,联想模拟器 v7.3.0 精简版

热门文章

  1. 用JQuery或JS改变div的id的五种方法
  2. 【贵州i茅台周年答题--答案】
  3. 烙铁-电子工程师的画笔
  4. sphinx分词搜索
  5. ps制作图标时的尺寸
  6. 注塑机计算机控制器,注塑机微机控制器,Microprocessor-based Controller for PIM,音标,读音,翻译,英文例句,英语词典...
  7. oracle12c创建监听,Oracle 12c为PDB创建专用监听
  8. Redis docker安装及redis.conf配置文件解析
  9. Win10系统“此电脑”误删了,或者无缘无故消失了,怎么找回?
  10. Google App Engine + JDO + Spring MVC,CRUD示例