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编写 ...
随机推荐
- 遇到 Request header is too large,你是如何解决的?
看到群里有小伙伴问,这个异常要怎么解决: java.lang.IllegalArgumentException: Request header is too large 异常原因 根据Exceptio ...
- MAVEN 配置和基本使用
Maven 安装配置 解压 apache-maven-3.6.1.rar 既安装完成 配置环境变量 MAVEN_HOME 为安装路径的 bin 目录 在 Path 下添加 %MAVEN_HOME%\b ...
- Codeforce :466C. Number of Ways (数学)
https://codeforces.com/problemset/problem/466/C 解题说明:此题是一道数学题,若平分分成若干种情况,应当整体(sum)考虑,对sum/3进行分析.它是区分 ...
- AcWing 第 2 场周赛
比赛链接:Here AcWing 3626. 三元一次方程 暴力即可 void solve() { int n; cin >> n; for (int i = 0; i <= n / ...
- AtCoder Beginner Contest 204 (AB水题,C题DFS,D题位运算DP,E题BFS好题)
补题链接:Here A - Rock-paper-scissors 石头剪刀布,两方是一样的则输出该值,否则输出该值 int s[4] = {0, 1, 2}; void solve() { int ...
- mongoose学习记录
1 const mongoose = require('mongoose'); 2 3 mongoose.connect('mongodb://localhost/playground') 4 .th ...
- python常见面试题讲解(九)字符个数统计
题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里.不在范围内的不作统计.注意是不同的字符 输入描述: 输入N个字符,字符在 ...
- C:\Keil_v5\ARM\ARMCC\include\stdint.h contains an incorrect path.
1.问题 在使用Keil uvison5打开例程代码进行学习时,发现部分.h文件无法读取 2.解决方法 1.找到如图的设置按钮(小锤子) 2.根据自己所用的是C/C++还是ARM选择(我这里是C/C+ ...
- 2023第十四届极客大挑战 — PWN WP
WP可能有点简陋,因为是直接从docx导入到博客的,实在不想再重新写了!大家凑合着看吧!哈哈哈,问题不大! pwn方向出自:队友 nc_pwntools 只要过了chal1和chal2即可执行任意命令 ...
- [转帖]为什么需要在脚本文件的开头加上#!/ bin / bash?
本文翻译自:Why do you need to put #!/bin/bash at the beginning of a script file? I have made Bash scripts ...