19.9 Boost Asio 同步字典传输
这里所代指的字典是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;
}
读者可自行编译并运行上述代码,客户端发送一个字符串,服务端处理后返回处理后的字典格式字符串,如下图所示;

19.9 Boost Asio 同步字典传输的更多相关文章
- qt+boost::asio+tcp文件传输
客户端: void qt_boost::pbSendFileClicked(){ QString filename = ui.leFileName->text(); QByteArray ba ...
- boost::asio 同步&异步例子
同步客户端: using boost::asio; io_service service; ip::tcp::endpoint ep( ip::address::from_string(); ip:: ...
- 使用Boost asio实现同步的TCP/IP通信
可以先了解一下Boost asio基本概念,以下是Boost asio实现的同步TCP/IP通信: 服务器程序部分,如果想保留套接字之后继续通信,可以动态申请socket_type,保存指针,因为so ...
- boost::asio设置同步连接超时
boost::asio设置同步连接超时 CSDN上求助无果,只好用自创的非主流方法了.asio自带的例子里是用deadline_timer的async_wait方法来实现超时的,这种方法需要单独写 ...
- boost::ASIO的同步方式和异步方式
http://blog.csdn.net/zhuky/article/details/5364574 http://blog.csdn.net/zhuky/article/details/536468 ...
- BOOST.Asio——Overview
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
- boost::asio 的同、异步方式
转自:http://blog.csdn.net/zhuky/archive/2010/03/10/5364574.aspx Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C ...
- boost::asio译文
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...
- Boost.Asio技术文档
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
- Boost.Asio基本原理(CSDN也有Markdown了,好开森)
Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...
随机推荐
- 【python爬虫】requests高级用法 代理池搭建 爬虫实战
目录 昨日回顾 面试题 爬虫总结 今日内容 1 requests高级用法 1.0 解析json 1.1 ssl认证(了解) 1.2 使用代理(重要) 1.3 超时设置 1.4 异常处理 1.5 上传文 ...
- BBS项目(二):首页导航条搭建 修改密码功能 首页数据展示 个人站点页面
目录 首页导航条搭建 session判断用户是否登录 更换验证码 导航条更多功能 退出系统 修改密码前端页面 使用大模态框 编写模态框 前端表单编写 修改密码后端逻辑 接受参数 验证参数 修改密码 首 ...
- 成为一个合格程序员所必备的三种常见LeetCode排序算法
排序算法是一种通过特定的算法因式将一组或多组数据按照既定模式进行重新排序的方法.通过排序,我们可以得到一个新的序列,该序列遵循一定的规则并展现出一定的规律.经过排序处理后的数据可以更方便地进行筛选和计 ...
- Mysql--between
between 用于where 表达式中,选取介于两个值之间的数据范围,同and一起搭配使用 语法: expr [NOT] BETWEEN begin_expr AND end_expr; 在整个表达 ...
- The Cluster ID Zc7nlyfTQ5qPbhY2d8I_3A doesn't match stored clusterId Some(ZvQZIX9gTB-dj05be_i_-w) in meta.properties.
启动kafka时报错(部分信息): [2022-05-12 20:26:05,589] INFO Cluster ID = Zc7nlyfTQ5qPbhY2d8I_3A (kafka.server.K ...
- 数据结构——AVL树
AVL树是一种特殊的二叉查找树,其特征在于:对所有节点来说,其左子树和右子树间的高度差小于等于1.本文简要总结下AVL树的几种基本操作. 节点结构体定义 typedef struct Node_s { ...
- 二、java发送https的各类请求
导航 一.java发送http的各类请求 二.java发送https的各类请求 java开发中需要调用其他服务的对外提供的https请求,上一篇写的是调用http,处理方式不太一样,可以参考如下代码: ...
- mock使用
- vue.js从输入中的contenteditable元素获取innerhtml
<div class="actual-score" :contenteditable="$route.params.mode === 'edit'" v- ...
- 【rt-thread】构建自己的项目工程 -- 初始篇
现以stm32f429igt6芯片的板子 & Keil5编译环境为例,记述构建适配自己板子的rt-thread工程的过程 1.拿到rt-thread源码,进入bsp/stm32/librari ...