项目地址:https://github.com/wlgq2/orcaios
orca的网络部分基于libuv,并对libuv作了一层C++封装:https://github.com/wlgq2/libu...
orca的项目中编译了libuv1.22.0的vs2017及gcc5.50版本,如需使用其余版本,则需本身编译相应版本。
对于orca来讲,没有客户端及服务器的概念。orca中每个Framework都是一个端点(EndPoint)。端点与端点间会创建链接、发送识别协议及通讯。orca的每个端点都有一个惟一识别的id做为通讯网络中的识别依据。
对于使用来讲,在进行用户消息通讯前须要作如下设置:git
orca::core::FrameworkConfig类为Framework的配置,原型以下:github
struct FrameworkConfig { FrameworkConfig() { reset(); } void reset() { id = 0; threadCount = 1; endPointAddress = nullptr; } uint32_t id; uint32_t threadCount; std::shared_ptr<struct EndPointAddress> endPointAddress; };
其中id为framework指定id(用于通讯识别),threadCount为framework开启线程数,endPointAddress为本地绑定地址,定义以下:缓存
struct EndPointAddress { enum IPV { Ipv4 = 0, Ipv6 }; EndPointAddress(std::string ip, uint16_t port, IPV ipv) { this->ip = ip; this->port = port; this->ipv = ipv; } std::string ip; uint16_t port; IPV ipv; };
分别为ip、端口、ipv4/ipv6设置。
orca经过appendRemoteEndPoint接口添加远程Framework。
原型为:服务器
void appendRemoteEndPoint(struct EndPointAddress& addr);
void appendRemoteEndPoint(std::string ip, uint16_t port, EndPointAddress::IPV ipv = EndPointAddress::Ipv4);
orca的网络消息通讯与本地消息接口同样,只是在发送时须要指定远程Farmework的识别ID。须要说明的是,若是在链接创建前,调用接口发送网络消息,orca会把消息缓存到列队里等待链接创建并发送消息。若是在链接链接后消息发送失败,orca会触发错误回调函数。
一个完整的例子:网络
#include <iostream> #include "MessageType.h" #define USE_END_POINT_1 1 class ActorTest :public orca::Actor { public: ActorTest(orca::Framework* framework,std::string name = "") :Actor(framework, name) { registerHandler(std::bind(&ActorTest::handle,this,std::placeholders::_1,std::placeholders::_2)); } void handle(orca::MessagePack& pack, orca::Address& from) { std::cout << (char*)(pack.enter()) << std::endl; #if !USE_END_POINT_1 //remote message return.远程消息返回。 send(pack, from); #endif } }; int main(int argc, char** args) { //complie endpoint 1 编译端点1. #if USE_END_POINT_1 //framework configs. orca::FrameworkConfig config; config.id = 1024; config.threadCount = 1; config.endPointAddress = std::make_shared<orca::EndPointAddress>("0.0.0.0",10001, orca::EndPointAddress::Ipv4); orca::Framework framework(config); //append remote framework. framework.appendRemoteEndPoint("127.0.0.1", 10002); ActorTest actor(&framework); //message pack. char data[] = "a message from remote actor"; orca::MessagePack message; message.create(data,sizeof(data)); //actor->actor2(remote) send message. actor.send(message,"actor2",1025); framework.loop(); #else //complie endpoint 2 编译端点2. //framework configs. orca::FrameworkConfig config; config.id = 1025; config.threadCount = 1; config.endPointAddress = std::make_shared<orca::EndPointAddress>("0.0.0.0", 10002, orca::EndPointAddress::Ipv4); orca::Framework framework(config); //append remote framework. framework.appendRemoteEndPoint("127.0.0.1", 10001); ActorTest actor(&framework,"actor2"); framework.loop(); #endif }