前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ Boost 实现异步IO远控

C++ Boost 实现异步IO远控

作者头像
微软技术分享
发布2022-12-28 17:39:51
8320
发布2022-12-28 17:39:51
举报
文章被收录于专栏:Visual C++ 编程技术实践

Boost 利用ASIO框架实现一个跨平台的反向远控程序,该远控支持保存套接字,当有套接字连入时,自动存储到map容器,当客户下线时自动从map容器中移除,当我们需要与特定客户端通信时,只需要指定客户端ID号即可。

客户端代码 客户端代码如下,心跳检测,异步请求。

代码语言:javascript
复制
#define BOOST_BIND_GLOBAL_PLACEHOLDERS
#include <iostream>
#include <string>
#include <boost/asio.hpp> 
#include <boost/bind.hpp>  
#include <boost/array.hpp>
#include <boost/noncopyable.hpp>

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

int main(int argc, 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);

        // 循环验证是否在线
    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
                    {
                    }
                }
            }
            else
            {
                std::cout << "连接失败,正在重新连接." << std::endl;
            }
        }
    }
    catch (...)
    {
        return false;
    }

    std::system("pause");
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档