RCF的使用

1 篇文章 0 订阅

RCF是一个C++开发的RPC框架。下面把RCF的编译和简单使用过程做一个记录,使用的是RCF3.0,操作系统是Centos7.0(64位):

1、下载RCF源码

进入RCF官网,下载文件RCF-3.0.251.tar.gz

2、解压安装包

[root@localhost root]# tar -zvcf RCF-3.0.251.tar.gz
[root@localhost root]# cd RCF-3.0.251
[root@localhost RCF-3.0.251]# ls
demo  doc  include  LICENSE.txt  README.txt  src
[root@localhost RCF-3.0.251]# 

3、测试代码(RCF源码可以加入到程序中一起编译)

ex1_server.c

#include <iostream>
#include <RCF/RCF.hpp>

RCF_BEGIN(I_PrintService, "I_PrintService")  //RCF接口定义
	RCF_METHOD_V1(void, Print, const std::string &) //RCF_METHOD_通用前缀,V表示返回值void, //1表示一个参数
RCF_END(I_PrintService)

class PrintService
{
public:
	void Print(const std::string & s)
	{
		std::cout << "I_PrintService service: " << s << std::endl;
	}
};

int main(int argc, char **argv)
{
	try
	{
		RCF::RcfInit rcfInit;  //初始化RCF
		RCF::RcfServer server(RCF::TcpEndpoint("192.168.241.129", 500001)); //建立RCF远程服务,设定IP和端口

		PrintService printService;
		server.bind<I_PrintService>(printService);  //绑定接口函数
		
		server.start();  //启动服务,不会阻塞当前线程
		std::cout << "Press Enter to exit..." << std::endl;
		std::cin.get();
	}
	catch(const RCF::Exception &e)
	{
		std::cout << "Error: " << e.getErrorMessage() << std::endl;
	}


	return 0;
}

ex1_client.c

#include <iostream>
#include <RCF/RCF.hpp>


RCF_BEGIN(I_PrintService, "I_PrintService")  //RCF接口
	RCF_METHOD_V1(void, Print, const std::string &)
RCF_END(I_PrintService)

int main(int argc, char **argv)
{
	try
	{
		RCF::RcfInit rcfInit;  //初始化RCF
		std::cout << "Calling the I_PrintService Print() method. " << std::endl;
		RcfClient<I_PrintService> client(RCF::TcpEndpoint("192.168.241.129", 500001)); //创建客户端并连接
		
		for (int i = 0; i < 10000; i++)  //循环调用远程函数
		{
			client.Print("Hello World"); 
			std::cout << i << std::endl;
		}
	}
	catch(const RCF::Exception & e)
	{
		std::cout << "Error: " << e.getErrorMessage() << std::endl;
	}

	return 0;
}

4、编译

[root@localhost RCF]# g++ ex1_server.c ./RCF-3.0.251/src/RCF/RCF.cpp  -o ex1_server -I ./RCF-3.0.251/include/ -lpthread -ldl -luuid 
In file included from /usr/include/c++/4.8.2/type_traits:35:0,
                 from ./RCF-3.0.251/include/RCF/Idl.hpp:23,
                 from ./RCF-3.0.251/include/RCF/RCF.hpp:23,
                 from ex1_server.c:2:
/usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^
In file included from ./RCF-3.0.251/include/SF/Registry.hpp:31:0,
                 from ./RCF-3.0.251/include/SF/Serializer.hpp:369,
                 from ./RCF-3.0.251/include/SF/Archive.hpp:88,
                 from ./RCF-3.0.251/include/SF/Stream.hpp:322,
                 from ./RCF-3.0.251/include/SF/IBinaryStream.hpp:22,
                 from ./RCF-3.0.251/include/RCF/SerializationProtocol_SF.hpp:24,
                 from ./RCF-3.0.251/include/RCF/SerializationProtocol.hpp:38,
                 from ./RCF-3.0.251/include/RCF/ClientStub.hpp:37,
                 from ./RCF-3.0.251/include/RCF/Future.hpp:22,
                 from ./RCF-3.0.251/include/RCF/Idl.hpp:27,
                 from ./RCF-3.0.251/include/RCF/RCF.hpp:23,
                 from ex1_server.c:2:
./RCF-3.0.251/include/RCF/ThreadLibrary.hpp:23:24: fatal error: shared_mutex: No such file or directory
 #include <shared_mutex>
                        ^
compilation terminated.
In file included from /usr/include/c++/4.8.2/type_traits:35:0,
                 from ./RCF-3.0.251/include/RCF/TypeTraits.hpp:22,
                 from ./RCF-3.0.251/include/RCF/Config.hpp:22,
                 from ./RCF-3.0.251/src/RCF/RCF.cpp:19:
/usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^
In file included from ./RCF-3.0.251/include/RCF/ThreadPool.hpp:31:0,
                 from ./RCF-3.0.251/include/RCF/AmiThreadPool.hpp:25,
                 from ./RCF-3.0.251/src/RCF/AmiThreadPool.cpp:19,
                 from ./RCF-3.0.251/src/RCF/RCF.cpp:21:
./RCF-3.0.251/include/RCF/ThreadLibrary.hpp:23:24: fatal error: shared_mutex: No such file or directory
 #include <shared_mutex>

由于RCF3.0用到C++17标准,需要用到较新的gcc版本才能编译,不能通过yum update更新,只能下载gcc源码编译安装

5、编译后执行

[root@localhost RCF]# ./ex1_server 
Press Enter to exit...
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
.
.
.
[root@localhost RCF]# ./ex1_client 
Calling the I_PrintService Print() method. 
1
2
3
4
.
.
.
9997
9998
9999

6、将RCF编译成静态库,以免每次都要重新编译一遍RCF源码

[root@localhost RCF]# g++ RCF.cpp -c -I ../../include/ -lpthread -ldl -luuid
[root@localhost RCF]# ar rcs libRCF.a RCF.o 
[root@localhost RCF]# ls
AmiThreadPool.cpp                 FileSystem.cpp            MemStream.cpp                 ReallocBuffer.cpp              TimedBsdSockets.cpp
AsioHandlerCache.cpp              FileTransferService.cpp   MethodInvocation.cpp          RemoteCallContext.cpp          Timer.cpp
AsioServerTransport.cpp           Filter.cpp                MulticastClientTransport.cpp  Schannel.cpp                   Tools.cpp
Base64.cpp                        FilterService.cpp         NamedPipeEndpoint.cpp         SerializationProtocol.cpp      UdpClientTransport.cpp
BoostSystem.cpp                   Future.cpp                ObjectPool.cpp                ServerObjectService.cpp        UdpEndpoint.cpp
BsdClientTransport.cpp            Globals.cpp               OpenSslEncryptionFilter.cpp   ServerStub.cpp                 UdpServerTransport.cpp
ByteBuffer.cpp                    HttpClientTransport.cpp   PerformanceData.cpp           ServerTask.cpp                 UnixLocalClientTransport.cpp
ByteOrdering.cpp                  HttpConnectFilter.cpp     PeriodicTimer.cpp             ServerTransport.cpp            UnixLocalEndpoint.cpp
CallbackConnectionService.cpp     HttpEndpoint.cpp          PingBackService.cpp           Service.cpp                    UnixLocalServerTransport.cpp
Certificate.cpp                   HttpFrameFilter.cpp       Platform.cpp                  SessionTimeoutService.cpp      UsingBsdSockets.cpp
ClientStub.cpp                    HttpsClientTransport.cpp  ProxyEndpoint.cpp             SspiFilter.cpp                 Uuid.cpp
ClientStubLegacy.cpp              HttpsEndpoint.cpp         ProxyEndpointService.cpp      stdafx.cpp                     Version.cpp
ClientTransport.cpp               HttpServerTransport.cpp   ProxyEndpointTransport.cpp    stdafx.h                       Win32Certificate.cpp
ConnectedClientTransport.cpp      HttpSessionFilter.cpp     PublishingService.cpp         SubscriptionService.cpp        Win32NamedPipeClientTransport.cpp
CurrentSerializationProtocol.cpp  HttpsServerTransport.cpp  RCF_1.cpp                     SubscriptionServiceLegacy.cpp  Win32NamedPipeEndpoint.cpp
CurrentSession.cpp                InitDeinit.cpp            RCF_2.cpp                     Tchar.cpp                      Win32NamedPipeServerTransport.cpp
DynamicLib.cpp                    IpAddress.cpp             RCF_3.cpp                     TcpClientTransport.cpp         Win32Username.cpp
Enums.cpp                         IpClientTransport.cpp     RcfClient.cpp                 TcpEndpoint.cpp                ZlibCompressionFilter.cpp
ErrorMsg.cpp                      IpServerTransport.cpp     RCF.cpp                       TcpServerTransport.cpp
Exception.cpp                     libRCF.a                  RCF.o                         ThreadLibrary.cpp
FileIoThreadPool.cpp              Log.cpp                   RcfServer.cpp                 ThreadLocalData.cpp
FileStream.cpp                    Marshal.cpp               RcfSession.cpp                ThreadPool.cpp
[root@localhost RCF]# 

现在可以直接通过静态库进行编译

[root@localhost RCF]# g++ ex1_client.c -o ex1_client -I ./RCF-3.0.251/include/ -lpthread -ldl -luuid -lRCF -L.
[root@localhost RCF]# 

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vfdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值