19.12 Boost Asio 获取远程进程
远程进程遍历功能实现原理与远程目录传输完全一致,唯一的区别在于远程进程枚举中使用EnumProcess函数枚举当前系统下所有活动进程,枚举结束后函数返回一个PROCESSENTRY32类型的容器,其中的每一个成员都是一个进程信息,只需要对该容器进行动态遍历即可得到所有的远程主机列表。
服务端代码如下所示,首先代码中通过read_some第一次接收到对端进程数量,接着通过第一个循环,将接收到的字符串数据强制转换为PROCESSENTRY32类型的结构,并将结构存入vector容器内,第二个循环则用于枚举输出我们整理好的容器列表。
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <vector>
#include <Windows.h>
#include <tlhelp32.h>
#include <boost/lexical_cast.hpp>
using namespace boost;
using namespace boost::asio;
using namespace std;
int main(int argc, char* argv[])
{
io_service io_service;
ip::tcp::acceptor acceptor(io_service, ip::tcp::endpoint(ip::tcp::v4(), 6666));
ip::tcp::socket socket(io_service);
acceptor.accept(socket);
boost::system::error_code error_code;
// 接收客户端的进程数量
char process_count[32] = { 0 };
socket.read_some(boost::asio::buffer(process_count), error_code);
std::cout << "接收到的进程数量: " << process_count << std::endl;
std::vector<PROCESSENTRY32> recv_process_list;
// 循环接收客户端进程结构体
for (int x = 0; x < lexical_cast<int>(process_count); x++)
{
// 接收字节序,并存入本地列表中
char recv_buffer[sizeof(PROCESSENTRY32)] = { 0 };
socket.read_some(boost::asio::buffer(recv_buffer, sizeof(PROCESSENTRY32)), error_code);
// 强转指针
PROCESSENTRY32 *ptr = (PROCESSENTRY32 *)recv_buffer;
// 将每一个 PROCESSENTRY32 结构存入vector容器
recv_process_list.push_back(*ptr);
}
// 循环输出 PROCESSENTRY32 测试是否可读取
for (int x = 0; x < recv_process_list.size(); x++)
{
std::cout << "进程PID: " << recv_process_list[x].th32ProcessID
<< "父进程PID: " << recv_process_list[x].th32ParentProcessID
<< "进程名称: " << recv_process_list[x].szExeFile << std::endl;
}
std::system("pause");
return 0;
}
客户端代码如下所示,其实现原理与文件传输功能完全一致,此处只是更换了一个EnumProcess函数,其传输方式此处就不在赘述。
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <vector>
#include <Windows.h>
#include <tlhelp32.h>
#include <boost/lexical_cast.hpp>
using namespace boost;
using namespace boost::asio;
using namespace std;
// 输出系统进程信息,并出入vector容器中返回给调用者
std::vector<PROCESSENTRY32> EnumProcess()
{
std::vector<PROCESSENTRY32> process_info;
PROCESSENTRY32 pe32 = { 0 };
pe32.dwSize = sizeof(PROCESSENTRY32);
// 获取全部进程快照
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE != hProcessSnap)
{
// 获取快照中第一条信息
BOOL bRet = Process32First(hProcessSnap, &pe32);
while (bRet)
{
// 将进程快照到的列表加入到容器中
process_info.push_back(pe32);
// 获取快照中下一条信息
bRet = Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
}
return process_info;
}
int main(int argc, char * argv[])
{
io_service io_service;
ip::tcp::socket socket(io_service);
ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 6666);
boost::system::error_code error_code;
socket.connect(ep, error_code);
// send_process_list 存储需要发送的结构体
std::vector<PROCESSENTRY32> send_process_list = EnumProcess();
// 首先将当前进程数量发送给服务端
std::string process_count = lexical_cast<std::string>(send_process_list.size());
std::cout << "当前进程数量: " << process_count << std::endl;
socket.write_some(boost::asio::buffer(process_count));
// 循环发送每一个进程结构
for (int x = 0; x < send_process_list.size(); x++)
{
// 定义发送字节序缓冲区
char send_buffer[sizeof(PROCESSENTRY32)] = { 0 };
// 拷贝字节序并发送字节序
memcpy(send_buffer, &send_process_list[x], sizeof(PROCESSENTRY32));
socket.write_some(boost::asio::buffer(send_buffer, sizeof(PROCESSENTRY32)));
}
std::system("pause");
return 0;
}
读者可自行编译上述代码片段,并依次运行服务端与客户端,此时读者可清晰的看到目标主机中所运行的完整进程列表。

19.12 Boost Asio 获取远程进程的更多相关文章
- boost.asio包装类st_asio_wrapper开发教程(2013.12.8更新)(二)
如果你是偶然浏览到这里,请先看 源代码及例程下载地址:命令行:svn checkout http://st-asio-wrapper.googlecode.com/svn/trunk/ st-asio ...
- Boost.Asio基本原理(CSDN也有Markdown了,好开森)
Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...
- 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 ...
- PHP下通过file_get_contents\curl的方法实现获取远程网页内容(别忘了还有PhpRPC)
[php]PHP中file_get_contents()与file_put_contents()函数细节详解 php函数file_get_contents(一) 案例: 早在2010年时候遇到过这样的 ...
- Boost.Asio技术文档
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
- PHP高效获取远程图片尺寸和大小(转)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- 使用Boost.Asio编写通信程序
摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...
- boost asio 异步实现tcp通讯
---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一.前言 boost asio可算是一个简 ...
- boost.asio系列——io_service
IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...
随机推荐
- 【白话科普】聊聊 DNS 的那些小知识
你是否在上网时,遇到过这样的情况:QQ 能正常发送消息,但是网页却打不开,查看网络连接又正常显示.面对这种情况很多小伙伴都感到有些无措.那究竟要怎么处理,这究竟是怎么回事呢? 上网查询得知,一般情况下 ...
- 精细化边缘安全防护:如何防止CDN域名被恶意刷量?
越是数字化时代,越要做好基建"安全"的顶层设计 随着消费及产业互联网的不断发展,数字化将实现全场景覆盖,人类的生活和生产方式也随之不断改变. 内容分发网络CDN(Content D ...
- AtCoder Regular Contest 121 (AB题解)
补题链接:Here A - 2nd Greatest Distance 二维坐标图中有 \(n\) 个房子,现在规定两房子距离定义为: \(max(|x_i−x_j|,|y_i−y_j|)\) 求第二 ...
- 2022 开源之夏 | Serverless Devs 陪你“变得更强”
Serverless 是近年来云计算领域热门话题,凭借极致弹性.按量付费.降本提效等众多优势受到很多人的追捧,各云厂商也在不断地布局 Serverless 领域.但是随着时间的发展,Serverles ...
- vue配置proxy实现跨域
- Visual Studio2019 使用WCF服务
什么是WCF Windows Communication Foundation (WCF) 是一个框架,用于生成面向服务的应用程序.它取代了较旧的进程间通信技术,例如 ASMX Web 服务..NET ...
- sublime_text4 2023最新版 激活教程
官网 Sublime HQ - Remarkable Software 东西在教学的时候还是挺好用的,就是要付费购买,穷,没钱 买不起,自己动手丰衣足食. 下载安装包 我现在最新版是4.4152 下面 ...
- andriod sdk安装与使用
一.进入以下网站下载 https://www.androiddevtools.cn/ 选择sdk工具-sdktools,这个工具比较好,可以通过SDK Manager下载到各种想要的包 有zip与ex ...
- 04 Tcl字符串
Tcl字符串 4.1 Tcl将说有的变量值视作字符串,并将他们作为字符串进行保存. 命令 描述 append 将值追加到字符串尾 binary 二进制化字符串 format 字符串格式化 regexp ...
- 【ThreadX-FileX】Azure RTOS FileX概述
Azure RTOS FileX嵌入式文件系统是Azure RTOS的高级工业级解决方案,适用于Microsoft FAT文件格式,专门针对深度嵌入式,实时和IoT应用程序而设计.Azure RTOS ...