st_asio_wrapper

st_asio_wrapper_第1张图片

st_asio_wrapper


版权声明:本文为 cheng-zhi 原创文章,可以随意转载,但必须在明确位置注明出处!

简介

·st_asio_wrapper 是基于 Boost.Asio 的异步 C/S 通信框架,因为项目中使用到这个库,所以这里记录下使用的方法。

这里是它的 GitHub 地址:st_asio_wrapper

具体的用法在它的网站上已经有了详细的介绍,这里总结下自己的使用方法和踩过的坑。

TCP-TCP 连接

TCP 客户端

为了实现 TCP 的连接,我们在客户端需要继承 st_connector,然后重写 on_msg_handle 或者 on_msg 函数来自定义处理消息,核心代码如下所示:

#pragma once

//configuration
#undef MAX_MSG_NUM
#define MAX_MSG_NUM    1500
//#define FORCE_TO_USE_MSG_RECV_BUFFER  //force to use the msg recv buffer

#include "stdafx.h" 

#include "communication/st_asio_wrapper_base.h"
#include "communication/st_asio_wrapper_tcp_client.h"
#include 
using namespace st_asio_wrapper;

class CTcpClient
{
public:
    CTcpClient();
    ~CTcpClient();

private:
    class MyConnector : public st_connector
    {
        public:
            MyConnector(boost::asio::io_service& io_service_) : st_connector(io_service_){}
        protected:
            typedef std::string MsgType;
            // 自定义处理消息
            virtual void on_msg_handle(MsgType& msg)
            {
                AfxMessageBox(_T("on_msg_handle"));
            }
            
            virtual bool on_msg(MsgType& msg)
            {
                AfxMessageBox(_T("on_msg"));
                return true;
            }
    };

private: 
    st_service_pump  m_pump;
    st_sclient m_client;
};

这里只是部分的核心代码,全部的代码最后会给出链接。

TCP 服务器端

我们在 TCP 服务器端直接发送指定的消息即可,核心代码如下所示:

class CTcpServer
{
public:
    CTcpServer();
    ~CTcpServer();

private:
    typedef std::string msg_type;

public: 
    // 发送一条字符串消息
    void send_msg(const msg_type& p_msg)
    { 
        m_server.broadcast_msg(p_msg);  
    }

private: 
    class My_st_server_socket : public st_server_socket_base<>
    {
        public:
            typedef std::string msg_type;
        public:
            My_st_server_socket(i_server& server_): st_server_socket_base(server_){}  
    };

private: 
    st_service_pump m_pump;
    st_server_base m_server;   
};

UDP - UDP 链接

UDP 发送

UDPTCP 要简单些,因为 UDP 是面向无连接的协议。下面 是UDP 发送的核心代码:

#pragma once
#include "communication/st_asio_wrapper_base.h"
#include "communication/st_asio_wrapper_udp_client.h"
#include "communication/st_asio_wrapper_udp_socket.h"
#include "communication/st_asio_wrapper_client.h"
using namespace st_asio_wrapper;

class CUdpServer
{
public:
    CUdpServer();
    ~CUdpServer();
public:
    typedef std::string MsgType;
    // 发送 UDP 消息
    void SendMsg(const MsgType& msg)
    {
        m_UdpServer.safe_send_native_msg(m_PeerAddr, msg);
    }
private:
    boost::asio::ip::udp::endpoint m_PeerAddr; 
    st_service_pump m_UdpPump;
    st_udp_sclient m_UdpServer;
};

UDP 接收

我们在接收 UDP 消息的时候,需要继承 st_udp_socket 类,重写 on_msg_handle 或者 on_msg 来自定义消息处理。下面是 UDP 接收的核心代码:

#pragma once

#include "communication/st_asio_wrapper_base.h"
#include "communication/st_asio_wrapper_udp_socket.h"
#include "communication/st_asio_wrapper_udp_client.h"
#include "communication/st_asio_wrapper_client.h"

using namespace st_asio_wrapper;

class CUdpClient
{
public:
    CUdpClient();
    ~CUdpClient();
private:
    class MyUdpConnector : public st_udp_socket
    {
        typedef std::string msg_type;

        public:
            MyUdpConnector(boost::asio::io_service& io_service_): st_udp_socket(io_service_) {}
        protected:
            // 重写 on_msg 
            virtual bool on_msg(msg_type& msg)
            {
                //自定义处理消息
                AfxMessageBox(_T("Test"));
                return true;
            }
            // 重写 on_msg_handle
            virtual bool on_msg_handle(msg_type& msg)
            {
                return true;
            }
    };

private:
    st_service_pump m_Pump;
    st_sclient m_client;
    boost::asio::ip::udp::endpoint m_PeerAddr;
};

注意

在 TCP 的客户端和服务器端和 UDP 发送以及接收端,你要保证你的通信库是相同的版本,否则可能出现接收不到消息的情况发送,我之前的遇到过这种情况,因为自己下载过比较新的版本,而项目使用的是老的版本,结果导致连接失败。

全部代码

百度云盘地址:

链接:http://pan.baidu.com/s/1hs5PxQk 密码:c4kj

原文地址

你可能感兴趣的:(st_asio_wrapper)