前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >19.9 Boost Asio 同步字典传输

19.9 Boost Asio 同步字典传输

作者头像
微软技术分享
发布2023-11-11 08:19:16
1630
发布2023-11-11 08:19:16
举报

这里所代指的字典是Python中的样子,本节内容我们将通过使用Boost中自带的Tokenizer分词器实现对特定字符串的切割功能,使用Boost Tokenizer,可以通过构建一个分隔符或正则表达式的实例来初始化tokenizer。然后,可以使用该实例对输入字符串进行划分。tokenizer将在输入字符串中寻找匹配输入模式的标记,并将其拆分为单独的字符串。

首先我们先来看服务端是如何实现的,在服务端中我们接收客户端传递过来的GetProcess,lyshark.exe字符串,然后通过使用tokenizer分词器提取出其内部的lyshark.exe字符串,接着调用GetProcess函数将进程名传递进去,此时该函数会输出一个字典格式的字符串,此时通过write_some即可将该字符串发送给客户端。

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <boost/format.hpp>
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>

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

// 获取系统进程是否存在
std::string GetProcess(const char *procressName)
{
  boost::format fmt("{'ProcName' : %s , 'Count' : 1002 }");
  fmt %procressName;
  return fmt.str();
  return "{ 'ProcName' : 'None', 'Count' : 0 }";
}

int main(int argc, char* argv[])
{
  try
  {
    asio::io_service io_service;
    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 6666));

    while (1)
    {
      tcp::socket socket(io_service);
      acceptor.accept(socket);

      boost::array<char, 4096> buf;
      size_t len = socket.read_some(boost::asio::buffer(buf));

      // 判断第一个参数是否为GetProcess
      if (strncmp(buf.data(), "GetProcess", strlen("GetProcess")) == 0)
      {
        std::string strTag = buf.data();
        system::error_code ignored_error;

        // 通过分割器切割出前后数组
        boost::char_separator<char> sep(", ");

        typedef boost::tokenizer<boost::char_separator<char>> CustonTokenizer;
        CustonTokenizer tok(strTag, sep);

        // 迭代切割,并将结果放入vector容器
        std::vector<std::string> vecSegTag;
        for (CustonTokenizer::iterator beg = tok.begin(); beg != tok.end(); ++beg)
          vecSegTag.push_back(*beg);

        // 将第一个参数也就是 GetProcess,lyshark.exe 中的lyshark.exe 传入GetProcess函数
        std::string ref_string = GetProcess(const_cast<char *>(vecSegTag[1].c_str()));
        // 得到结果返回给客户端
        socket.write_some(asio::buffer(ref_string), ignored_error);
      }
    }
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }
  
  std::system("pause");
  return 0;
}

接着就是客户端部分,在该部分中我们构建GetProcess,lyshark.exe字符串并将该字符串write_some发送给服务端程序,接着通过read_some等待服务端传值,当收到传递过来的字典{'ProcName' : lyshark.exe , 'Count' : 1002 }则程序退出。

代码语言:javascript
复制
#include <iostream>
#include <boost/array.hpp>
#include <boost/asio.hpp>

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

int main(int argc, char* argv[])
{
  try
  {
    boost::asio::io_service io_service;
    tcp::endpoint end_point(boost::asio::ip::address::from_string("127.0.0.1"), 6666);

    tcp::socket socket(io_service);
    socket.connect(end_point);

    system::error_code ignored_error;

    // 发送命令行
    std::string message = "GetProcess,lyshark.exe";
    socket.write_some(asio::buffer(message), ignored_error);

    // 获取远端返回结果
    boost::array<char, 4096> buf = { 0 };
    size_t len = socket.read_some(boost::asio::buffer(buf));
    std::cout << "返回数据: " << buf.data() << std::endl;
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  std::system("pause");
  return 0;
}

读者可自行编译并运行上述代码,客户端发送一个字符串,服务端处理后返回处理后的字典格式字符串,如下图所示;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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