远程进程遍历功能实现原理与远程目录传输完全一致,唯一的区别在于远程进程枚举中使用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. 【白话科普】聊聊 DNS 的那些小知识

    你是否在上网时,遇到过这样的情况:QQ 能正常发送消息,但是网页却打不开,查看网络连接又正常显示.面对这种情况很多小伙伴都感到有些无措.那究竟要怎么处理,这究竟是怎么回事呢? 上网查询得知,一般情况下 ...

  2. 精细化边缘安全防护:如何防止CDN域名被恶意刷量?

    越是数字化时代,越要做好基建"安全"的顶层设计 随着消费及产业互联网的不断发展,数字化将实现全场景覆盖,人类的生活和生产方式也随之不断改变. 内容分发网络CDN(Content D ...

  3. AtCoder Regular Contest 121 (AB题解)

    补题链接:Here A - 2nd Greatest Distance 二维坐标图中有 \(n\) 个房子,现在规定两房子距离定义为: \(max(|x_i−x_j|,|y_i−y_j|)\) 求第二 ...

  4. 2022 开源之夏 | Serverless Devs 陪你“变得更强”

    Serverless 是近年来云计算领域热门话题,凭借极致弹性.按量付费.降本提效等众多优势受到很多人的追捧,各云厂商也在不断地布局 Serverless 领域.但是随着时间的发展,Serverles ...

  5. vue配置proxy实现跨域

  6. Visual Studio2019 使用WCF服务

    什么是WCF Windows Communication Foundation (WCF) 是一个框架,用于生成面向服务的应用程序.它取代了较旧的进程间通信技术,例如 ASMX Web 服务..NET ...

  7. sublime_text4 2023最新版 激活教程

    官网 Sublime HQ - Remarkable Software 东西在教学的时候还是挺好用的,就是要付费购买,穷,没钱 买不起,自己动手丰衣足食. 下载安装包 我现在最新版是4.4152 下面 ...

  8. andriod sdk安装与使用

    一.进入以下网站下载 https://www.androiddevtools.cn/ 选择sdk工具-sdktools,这个工具比较好,可以通过SDK Manager下载到各种想要的包 有zip与ex ...

  9. 04 Tcl字符串

    Tcl字符串 4.1 Tcl将说有的变量值视作字符串,并将他们作为字符串进行保存. 命令 描述 append 将值追加到字符串尾 binary 二进制化字符串 format 字符串格式化 regexp ...

  10. 【ThreadX-FileX】Azure RTOS FileX概述

    Azure RTOS FileX嵌入式文件系统是Azure RTOS的高级工业级解决方案,适用于Microsoft FAT文件格式,专门针对深度嵌入式,实时和IoT应用程序而设计.Azure RTOS ...