RCF的使用

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 
#include 

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(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 
#include 


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 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 
                        ^
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 

由于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]# 

 

你可能感兴趣的:(linux,RCF,RCF,远程调用)