开发一个 c++ 网络库

zbluenet (蓝网) 跨平台 c++ 服务器网络库

抽空研究了一下muduo网络库,看了一些github上优秀的源码,自己实现了一个c++网络库,基本功能已经完成,还在开发中

github地址: zbluenet-cpp

1. 跨平台
1. 支持windows 平台, 使用vs2017 编译
2. 支持 linux 平台, make 一键编译
2. IO多路复用,多线程处理
1. windows 上使用 select 模式
2. linux 上使用epoll
3. 一个accept 线程, 多个 reactor 线程,  reactor 线程由用户配置, acceptor 线程负责均衡各个 reactor 线程处理的socket 数
4. reactor 线程负责处理 收包,发包, 解包,封包
3. 主逻辑单线程,不并发
1. 各个reactor 线程把解包的数据发送到主线程, 主线程有个消息队列, 排队处理消息
4. c++11语法
1. 程序中广泛使用到了lambda 表达式, 仿函数, 智能指针
2. 只使用c++ 标准库, 没有使用任何第三方算法库
5. 例子
    zbluenet::LogManager::getInstance()->setMaxLoggerCount(2);

    pserver_ = new zbluenet::server::GameServer("127.0.0.1", 9091, 2);
    std::string log_file_main = "./zbluenet.%Y%m%d.log";
    pserver_->initMainLogger(log_file_main, zbluenet::LogLevel::DEBUG, true);
    std::string log_file_net = "./net.%Y%m%d.log";
    pserver_->initNetLogger(log_file_net, zbluenet::LogLevel::DEBUG, true);

    // 服务初始化
    if (false == pserver_->init(
        std::bind(&ServerApp::onConnect, this, std::placeholders::_1),
        std::bind(&ServerApp::onDisconnect, this, std::placeholders::_1),
        nullptr, 30000)) {
        LOG_DEBUG("server initialized fail");
        return;
    }

    // 注册消息
    C2SLoginMessageHandler::bind();

    // 开启定时器
    pserver_->startTimer(1000, [](int64_t timer_id)-> void {
        LOG_DEBUG("timer %lld called", timer_id);
    }, 10);

    pserver_->startTimer(1001, [](int64_t timer_id)-> void {
        LOG_DEBUG("timer %lld called", timer_id);
    });

    // 启动服务
    pserver_->start();


// 消息绑定
void C2SLoginMessageHandler::bind()
{
	sServerApp->registerMessageHandler<protocol::C2SLoginReqMessage>(
		std::bind(&C2SLoginMessageHandler::onC2SLoginRequest, std::placeholders::_1, std::placeholders::_2));
}

void C2SLoginMessageHandler::onC2SLoginRequest(const zbluenet::net::NetId &net_id, const protocol::C2SLoginReqMessage *request)
{
	LOG_DEBUG("zjw called %s", request->dump().c_str());

	std::unique_ptr<protocol::S2CLoginRespMessage> message(new protocol::S2CLoginRespMessage());
	message->data.set_ret(9999);
	sServerApp->sendMessage(net_id, message);

// 发送消息到 战斗服务器
	std::unique_ptr<protocol::S2CLoginRespMessage> message2(new protocol::S2CLoginRespMessage());
	message2->data.set_ret(9999);
	sServerApp->sendBattleMessage(1001, message2);
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值