可扩展性
传输
对于前一个版本的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_SERIALIZATION
和RCF_USE_SF_SERIALIZATION
都没有被定义,RCF_USE_SF_SERIALIZATION
将会被自动定义。
l
RCF_NO_AUTO_INIT_DEINIT
:禁止RCF的自动初始化和反初始化功能。如果定义了,用户需要在适当的时间显示地调用RCF::init()
和RCF::deinit()
。特别地,当把RCF编译成DLL时,需要去定义这个预编译符号,从而防止过早地初始化。
总的来说,对第三方库的依赖(Boost.Threads
, Boost.Serialization
, Zlib
, OpenSSL
)是可选的。编译这些库的说明已经超出本篇文章的范围,但是如果你在编译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++ 应用程序方面。作者喜欢程序设计,但更喜欢滑雪和乒乓球运动。别人提到他时他会感到非常大的满足。