Home

cdeveloper

读书,写作

st_asio_wrapper


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

简介

·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 <string>
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<MyConnector> 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<My_st_server_socket> 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<MyUdpConnector> m_client;
	boost::asio::ip::udp::endpoint m_PeerAddr;
};

注意

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

cdeveloper at 05/22/17