远程进程遍历功能实现原理与远程目录传输完全一致,唯一的区别在于远程进程枚举中使用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 获取远程进程的更多相关文章

  1. boost.asio包装类st_asio_wrapper开发教程(2013.12.8更新)(二)

    如果你是偶然浏览到这里,请先看 源代码及例程下载地址:命令行:svn checkout http://st-asio-wrapper.googlecode.com/svn/trunk/ st-asio ...

  2. Boost.Asio基本原理(CSDN也有Markdown了,好开森)

    Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...

  3. boost::asio 的同、异步方式

    转自:http://blog.csdn.net/zhuky/archive/2010/03/10/5364574.aspx Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C ...

  4. boost::asio译文

        Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...

  5. PHP下通过file_get_contents\curl的方法实现获取远程网页内容(别忘了还有PhpRPC)

    [php]PHP中file_get_contents()与file_put_contents()函数细节详解 php函数file_get_contents(一) 案例: 早在2010年时候遇到过这样的 ...

  6. Boost.Asio技术文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  7. 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 ...

  8. 使用Boost.Asio编写通信程序

    摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...

  9. boost asio 异步实现tcp通讯

    ---恢复内容开始--- asioboost   目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化   一.前言 boost asio可算是一个简 ...

  10. boost.asio系列——io_service

    IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...

随机推荐

  1. pod内部网络实现

    k8s主题系列: 一.k8s网络之设计与实现 二.k8s网络之pod内部网络 三.k8s网络之Flannel网络 四.k8s网络之Calico网络 pod特性 Pod 是 K8S 的最小工作单元.每个 ...

  2. 用Python自动清理系统垃圾,再也不用360安全卫士了

    用Python自动清理系统垃圾,再也不用360安全卫士了 在Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:.tmp.._mp)日志文件(.log).临时帮助文件(.gid ...

  3. Spring | 利用Maven搭建Spring的开发环境

    本节主要介绍如何利用Maven搭建 Spring 开发环境,使用 Spring 之前需要安装 JDK .Maven和 IDEA 建议一定要从 Maven 项目开始,而不是从空项目开始,空项目开始会出现 ...

  4. AtCoder Beginner Contest 163 (6/6)

    比赛链接:Here AB水题, C - management 题意:给一棵 \(N(2\le N\le2e5)\)​ 个节点的有根树,求每个节点的儿子数. 思路:由于输入直接给的是每个节点的父节点,直 ...

  5. debian更新openssh 9.6

    先更新一下,然后安装libssl-dev zlib1g-dev依赖文件 apt update apt install build-essential apt-get install -y libssl ...

  6. 如何在iOS手机上查看应用日志

    ​ 引言 在开发iOS应用过程中,查看应用日志是非常重要的一项工作.通过查看日志,我们可以了解应用程序运行时的状态和错误信息,帮助我们进行调试和排查问题.本文将介绍两种方法来查看iOS手机上的应用日志 ...

  7. 每天学五分钟 Liunx 0000 | 存储篇:GlusterFS

    GlusterFS GlusterFS,是一个分布式文件系统,它通过 TCP/IP 或 IB(InfiniBand RDMA)网络将多个存储资源整合在一起,提供存储服务,具有很强的可扩展能力.   G ...

  8. spring-transaction源码分析(1)概述和事务传播级别

    spring-tx概述 spring-tx包使用注解驱动和AOP通知将事务开启.提交/回滚.以及复杂的传播机制封装了起来,开发者不再需要编写事务管理的代码,而是可以只关注自己的业务逻辑. 本文将简单介 ...

  9. CSS - 使图片自适应

    img {         height: 100%;         object-fit: cover; }

  10. 使用Python+FFMPEG实现视频分割与合并

    前言 日常中偶尔会遇到需要简单剪辑处理视频的场景,以前我可能会拿出PR来剪辑一下,(别跟我说国产那些软件,剪辑完视频强制加上广告片头片尾恶心的一批),但是PR毕竟太重量级,剪个简单的视频都要花不少时间 ...