zoukankan      html  css  js  c++  java
  • boost::asio::tcp 异步

    /*---------------------------------------------------------------------------
    文件    : SockServer.h
    版本    : V1.0
    描述    : asio socket server
    ---------------------------------------------------------------------------*/
    #pragma once
    #include <list>
    #include <thread>
    #include <boost/asio.hpp>
    #include <boost/serialization/singleton.hpp>
    using namespace std;
    using boost::asio::ip::tcp;
    
    
    #define tcpServer CSockServer::get_mutable_instance()
    class CSockServer : public boost::serialization::singleton<CSockServer>
    {
    public:
        CSockServer();
        ~CSockServer();
    
        bool Init();
        bool Start();
        void Stop();
    protected:
        void Run();
    
        //Accept 模板
        template <class S>
        void Accept(std::shared_ptr<tcp::acceptor> accept)
        {
            //异步等待一个客户端来连接
            accept->async_accept(
                [this, accept](const boost::system::error_code& ec, tcp::socket socket)
            {
                printf("%s %d 
    ", __FUNCTION__, __LINE__);
                if (!ec) {
    
                    //实例化连接对象(自定义一个类,实现业务操作 StartWork) 
                    std::make_shared<S>(std::move(socket))->StartWork();
                }
                else {
                    std::string xx = ec.message();
                    printf("Accept fsu session error:%s
    ", ec.message().c_str());
                    exit(-1);    
                }
                //创建完一个新的连接后, 需要再次异步等待下一个连接。不然Accept函数会退出。
                Accept<S>(accept);
            });
        }
    protected:
        //asio程序必须的io_service对象,使用io_service与系统的输入输出进行交互
        boost::asio::io_service m_ios;
        //守护io_service
        boost::asio::io_service::work m_work;
        //保存线程句柄
        std::vector<std::shared_ptr<std::thread>> m_vtxThreads;
    };
    /*---------------------------------------------------------------------------
    文件    : SockServer.cpp
    版本    : V1.0
    描述    : asio socket server,终端数据接收tcp端口,创建连接session
    ---------------------------------------------------------------------------*/
    #include <algorithm>
    #include <string>
    #include <thread>
    #include "com_def.h"
    #include "ClientSession.h"
    #include "SockServer.h"
    using namespace std;
    
    CSockServer::CSockServer()
        : m_work(m_ios)
    {
    }
    
    
    CSockServer::~CSockServer()
    {
    }
    
    //------------------------------------------------------------------------
    // 函数名称: Init
    // 返 回 值: bool    -- true 成功,false失败,一般是端口被占用
    // 说    明: 初始化,监听端口并开始异步accept
    //------------------------------------------------------------------------
    bool CSockServer::Init()
    {
        boost::system::error_code ec;
        try
        {
            std::shared_ptr<tcp::acceptor> accept1(new tcp::acceptor(m_ios, tcp::endpoint(tcp::v4(), 7200), false));
            Accept<ClientSession>(accept1);
        }
        catch (boost::system::system_error& e)
        {
            printf("Construct tcp::acceptor error:%s
    ", e.what());
            throw std::string("Construct tcp::acceptor error");
        }
        printf("CSockServer::Init() success! 
    ");
        return true;
    }
    
    //------------------------------------------------------------------------
    // 函数名称: Start
    // 返 回 值: bool    -- true成功, false 失败
    // 说    明: 多线程异步调用socket事件
    //------------------------------------------------------------------------
    bool CSockServer::Start()
    {
        if (!m_vtxThreads.empty())
        {
            printf("Attempt to start socket server while it's running!!
    ");
            return false;
        }
    
        unsigned int uCount = MAX_T((unsigned int)4, std::thread::hardware_concurrency());
        try
        {
            for (unsigned int i = 0; i < uCount; ++i)
            {
                //多线程异步调用socket事件
                std::shared_ptr<std::thread> t(new std::thread(&CSockServer::Run, this));
                m_vtxThreads.emplace_back(t);
            }
        }
        catch (const std::string&)
        {
            throw ("CSockServer::Start() error");
        }
    
        printf("CSockServer::Start() success! 
    ");
        return true;
    }
    
    //------------------------------------------------------------------------
    // 函数名称: Run
    // 返 回 值: void
    // 说    明: socket 事件循环
    //------------------------------------------------------------------------
    void CSockServer::Run()
    {
        boost::system::error_code ec;
        m_ios.run(ec);
        if (ec)
        {
            printf("Exit one socket server running thread with error msg:%s!", ec.message().c_str());
        }
        else
        {
            printf("Exit one socket server running thread with normal code!
    ");
        }
    }
    
    
    //------------------------------------------------------------------------
    // 函数名称: Stop
    // 返 回 值: void
    // 说    明: 服务停止
    //------------------------------------------------------------------------
    void CSockServer::Stop()
    {
        m_ios.stop();
    }
  • 相关阅读:
    针对大数据量 高并发量网站的解决方案
    session cookie 在用户登录中的使用
    彻底弄懂HTTP缓存机制及原理
    cookie 和session 的区别详解
    常见的浏览器兼容性问题
    内容分发网络(CDN)
    表现与数据分离、Web语义化
    关于bootstrap样式重写,无法覆盖的问题
    判断一个字符串中出现次数最多的字符
    [译]SQL Passion Week 10: 计划缓存
  • 原文地址:https://www.cnblogs.com/osbreak/p/14562109.html
Copyright © 2011-2022 走看看