设为首页 加入收藏

TOP

C++ ASIO 实现异步套接字管理(二)
2023-09-09 10:25:48 】 浏览:386
Tags:ASIO 步套接 管理
rgc, char * argv[]) { try { boost::asio::io_service io; tcp::socket socket(io); AsyncConnect hander(io, socket); boost::system::error_code error; tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 10000); // 循环验证是否在线 go_: while (1) { // 验证是否连接成功,并定义超时时间为5秒 if (hander.aysnc_connect(ep, 5000)) { io.run(); std::cout << "已连接到服务端." << std::endl; // 循环接收命令 while (1) { // 验证地址端口是否开放,默认等待5秒 bool is_open = hander.port_is_open("127.0.0.1", 10000, 5000); // 客户端接收数据包 boost::array<char, 4096> buffer = { 0 }; // 如果在线则继续执行 if (is_open == true) { socket.read_some(boost::asio::buffer(buffer), error); // 判断收到的命令是否为GetCPU if (strncmp(buffer.data(), "GetCPU", strlen("GetCPU")) == 0) { std::cout << "获取CPU参数并返回给服务端." << std::endl; socket.write_some(boost::asio::buffer("CPU: 15 %")); } // 判断收到的命令是否为GetMEM if (strncmp(buffer.data(), "GetMEM", strlen("GetMEM")) == 0) { std::cout << "获取MEM参数并返回给服务端." << std::endl; socket.write_some(boost::asio::buffer("MEM: 78 %")); } // 判断收到的命令是否为终止程序 if (strncmp(buffer.data(), "Exit", strlen("Exit")) == 0) { std::cout << "终止客户端." << std::endl; return 0; } } else { // 如果连接失败,则跳转到等待环节 goto go_; } } } else { std::cout << "连接失败,正在重新连接." << std::endl; } } } catch (...) { return false; } std::system("pause"); return 0; }

AsyncTcpServer 异步服务端

接着我们来实现异步TCP服务器,首先我们需要封装实现CAsyncTcpServer类,该类使用了多线程来支持异步通信,每个客户端连接都会创建一个CTcpConnection类的实例来处理具体的通信操作,该服务器类在连接建立、数据传输和连接断开时,都会通过事件处理器来通知相关操作,以支持服务器端的业务逻辑。其头文件声明如下所示;

#ifdef _MSC_VER
#define BOOST_BIND_GLOBAL_PLACEHOLDERS
#define _WIN32_WINNT 0x0601
#define _CRT_SECURE_NO_WARNINGS
#endif

#pragma once
#include <thread>
#include <array>
#include <boost\bind.hpp>
#include <boost\noncopyable.hpp>
#include <boost\asio.hpp>
#include <boost\asio\placeholders.hpp>

using namespace boost::asio;
using namespace boost::asio::ip;
using namespace boost::placeholders;
using namespace std;

// 每一个套接字连接,都自动对应一个Tcp客户端连接
class CTcpConnection
{
public:
	CTcpConnection(io_service& ios, int clientId) : m_socket(ios), m_clientId(clientId){}
	~CTcpConnection(){}

	int                        m_clientId;
	tcp::socket                m_socket;
	array<BYTE, 16 * 1024>     m_buffer;
};

typedef shared_ptr<CTcpConnection> TcpConnectionPtr;

class CAsyncTcpServer
{
public:
	class IEventHandler
	{
	public:
		IEventHandler(){}
		virtual ~IEventHandler(){}
		virtual void ClientConnected(int clientId) = 0;
		virtual void ClientDisconnect(int clientId) = 0;
		virtual void ReceiveData(int clientId, const BYTE* data, size_t length) = 0;
	};
public:
	CAsyncTcpServer(int maxClientNumber, int port);
	~CAsyncTcpServer();
	void AddEventHandler(IEventHandler* pHandler){ m_EventHandlers.push_back(pHandler); }

	void Send(int client
首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Pybind11绑定C++抽象类(DLL接口) 下一篇AC 自动机学习笔记

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目