19.9 Boost Asio 同步字典传输

news2024/10/6 20:31:27

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

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

#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 }则程序退出。

#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;
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1191464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云服务器u1和e实例有什么区别?哪个比较好?

阿里云服务器u1和e实例有什么区别&#xff1f;哪个比较好&#xff1f;通用算力型u1比较好&#xff0c;因为u1服务器是独享型云服务器&#xff0c;e实例是共享型。 阿里云服务器ECS经济型e实例和通用算力型u1实例有什么区别&#xff1f;如何选择&#xff1f;ECS经济型e实例是共…

Modern C++ 转换构造函数和类型转换函数

在 C/C 中&#xff0c;不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换&#xff08;隐式类型转换&#xff09;&#xff0c;需要用户显式地指明如何转换的称为强制类型转换。 不管是自动类型转换还是强制类型转换&#xff0c;前提必须是编译器知道如何…

U盘插在电脑上显示要格式化磁盘怎么办

U盘是一种便携式存储设备&#xff0c;广泛应用于各种场合。然而&#xff0c;有时候我们可能会遇到一些问题&#xff0c;比如将U盘插入电脑后显示要格式化磁盘&#xff0c;这通常意味着U盘的分区出现了问题或者U盘的文件系统已经损坏。这种情况下&#xff0c;我们应该如何解决呢…

linux 显卡驱动 cuda 离线安装

1、 安装显卡驱动&#xff1a; Download NVIDIA, GeForce, Quadro, and Tesla Drivers &#xff08;1&#xff09;注意选择对应的cuda版本&#xff0c;和系统版本&#xff0c;并下载 &#xff08;2&#xff09;

client-go controller-runtime kubebuilder

背景 这半年一直做k8s相关的工作&#xff0c;一直接触client-go controller-runtime kubebuilder&#xff0c;但是很少有文章将这三个的区别说明白&#xff0c;直接用框架是简单&#xff0c;但是出了问题就是黑盒&#xff0c;这不符合我的理念&#xff0c;所以这篇文章从头说起…

【C语言 | 预处理】C语言预处理详解(一) —— #define、#under、#if、#else、#elif、#endif、#include、#error

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Python基础教程之十八:Python字典交集–比较两个字典

Python示例&#xff0c;用于查找2个或更多词典之间的常见项目&#xff0c;即字典相交项目。 1.使用“&#xff06;”运算符的字典交集 最简单的方法是查找键&#xff0c;值或项的交集&#xff0c;即 & 在两个字典之间使用运算符。 example.pya { x : 1, y : 2, z : 3 }…

OCR技术狂潮:揭秘最新发展现状,引爆未来智能时代

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术自20世纪以来经历了长足的发展&#xff0c;随着计算机视觉、人工智能和深度学习等领域的进步&#xff0c;OCR技术在准确性、速度和适用范围上都取得了显著的进展。以下是OCR技术发展的现…

Verilog 之 initial 模块与always 模块的用法与差异

文章目录 initial语法和用法特点和注意事项用途 always语法和用法特点和注意事项用途 二者差异 initial 在 Verilog 中&#xff0c;initial 块是用来在模拟开始时执行一次性初始化操作的一种建模方式。它通常用于模拟初始条件或进行一次性的初始化设置&#xff0c;而且只会在模…

深度学习(生成式模型)——Classifier Free Guidance Diffusion

文章目录 前言推导流程训练流程测试流程 前言 在上一节中&#xff0c;我们总结了Classifier Guidance Diffusion&#xff0c;其有两个弊端&#xff0c;一是需要额外训练一个分类头&#xff0c;引入了额外的训练开销。二是要噪声图像通常难以分类&#xff0c;分类头通常难以学习…

聊聊模板引擎<Template engine>

模板引擎是什么 模板引擎是一种用于生成动态内容的工具&#xff0c;通常用于Web开发中。它能够将静态的模板文件和动态数据结合起来&#xff0c;生成最终的HTML、XML或其他文档类型。模板引擎通过向模板文件中插入变量、条件语句、循环结构等控制语句&#xff0c;从而实现根据…

Node.js中的文件系统(file system)模块

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

VS2015模块库交接出现环境报错 error MSB8031 和 error C1189

问题报错 1.错误 MSB8031 Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. 错误 MSB8031不赞成为非Unicode字符集生成MFC项目。您必须将项目属性更改为Unicode&…

【Excel】函数sumif范围中符合指定条件的值求和

SUMIF函数是Excel常用函数。使用 SUMIF 函数可以对报表范围中符合指定条件的值求和。 Excel中sumif函数的用法是根据指定条件对若干单元格、区域或引用求和。 sumif函数语法是&#xff1a;SUMIF(range&#xff0c;criteria&#xff0c;sum_range) sumif函数的参数如下&#xff…

(免费领源码)Node.js#koa#MySQL精品课程网站27724-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1研究背景 1.2研究现状及意义 1.3koa框架 1.4论文结构与章节安排 2精品课程网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析…

QWidget背景图片在Qt Designer 中能显示但运行时不显示的解决方法

目录 1. 现象 2. 解决方法 3. 附录 1. 现象 今天想在QWidget中贴一张png图片作为背景图&#xff0c;在Qt Designer 能显示&#xff0c;但运行时&#xff0c;死活不显示背景图片。样式表设置如下&#xff1a; QWidget {border-image:url(:/untitled2/image/operpanel.png); }…

如何捕捉牛熊转变的信号,澳福认为只需了解一个模式

在过去的交易市场&#xff0c;当所有的多头都买了&#xff0c;没有新的买家时&#xff0c;牛市就结束了。但是在今天的交易市场&#xff0c;激进的卖空者也会出现在趋势的顶部&#xff0c;澳福知道这个事实会改变重要趋势结束时的市场行为。当多头让位于空头时&#xff0c;牛市…

VUE element组件生成的全选框如何获取值

//先声明 const Selection ref([]);//获取 const handleSelectCodeForTicket (val) > {console.log(val);// values.value val;Selection.value [];val.forEach((v) > {Selection.value.push(v);});console.log(Selection.value); }; <el-table selection-change…

vue项目使用pcl.js展示.pcd/.bin点云文件

vue项目使用pcl展示.pcd/.bin点云文件 1.安装pcl.js2.在页面引入pcl及相关js3.开始实例化4.绘制画布注意&#xff1a;报错原因大部分是因为版本改动函数或者方法导致找不到函数或者方法&#xff0c;注意版本&#xff01;&#xff01;&#xff01; 1.安装pcl.js npm install pc…

Linux开发工具之编辑器vim

文章目录 1.vim是啥?1.1问问度娘1.2自己总结 2.vim的初步了解2.1进入和退出2.2vim的模式1.介绍2.使用 3.vim的配置3.1自己配置3.2下载插件3.3安装大佬配置好的文件 4.程序的翻译 1.vim是啥? 1.1问问度娘 1.2自己总结 vi/vim都是多模式编辑器&#xff0c;vim是vi的升级版本&a…