项目地址:https://github.com/wlgq2/orca

orca网络通信机制

orca的网络部分基于libuv,并对libuv做了一层C++封装:https://github.com/wlgq2/libu...
orca的项目中编译了libuv1.22.0的vs2017及gcc5.50版本,如需使用其他版本,则需自己编译相应版本。
对于orca来说,没有客户端及服务器的概念。orca中每一个Framework都是一个端点(EndPoint)。端点与端点间会建立连接、发送识别协议及通信。orca的每一个端点都有一个唯一识别的id作为通信网络中的识别依据。
对于使用来说,在进行用户消息通信前需要做以下设置:

  1. 指定本地Framework识别ID;
  2. 指定本地Framework绑定的端口及IP;
  3. 指定远程Framework端口及ID;

orca::core::FrameworkConfig类为Framework的配置,原型如下:

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的网络消息通信

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
}

莫失莫忘
9 声望1 粉丝