boost 利用asio框架实现一个跨平台的反向远控程序,该远控支持保存套接字,当有套接字连入时,自动存储到map容器,当客户下线时自动从map容器中移除,当我们需要与特定客户端通信时,只需要指定客户端id号即可。
客户端代码 客户端代码如下,心跳检测,异步请求。
#define boost_bind_global_placeholders
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/array.hpp>
#include <boost/noncopyable.hpp>
using namespace std;
using boost::asio::ip::tcp;
int main(int argc, char * argv[])
{
try
{
boost::asio::io_service io;
tcp::socket socket(io);
asyncconnect hander(io, socket);
boost::system::error_code error;
tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 10000);
// 循环验证是否在线
while (1)
{
// 验证是否连接成功,并定义超时时间为5秒
if (hander.aysnc_connect(ep, 5000))
{
io.run();
std::cout << "已连接到服务端." << std::endl;
// 循环接收命令
while (1)
{
// 验证地址端口是否开放,默认等待5秒
bool is_open = hander.port_is_open("127.0.0.1", 10000,5000);
// 客户端接收数据包
boost::array<char, 4096> buffer = { 0 };
// 如果在线则继续执行
if (is_open == true)
{
socket.read_some(boost::asio::buffer(buffer), error);
// 判断收到的命令是否为getcpu
if (strncmp(buffer.data(), "getcpu", strlen("getcpu")) == 0)
{
std::cout << "获取cpu参数并返回给服务端." << std::endl;
socket.write_some(boost::asio::buffer("cpu: 15 %"));
}
// 判断收到的命令是否为getmem
if (strncmp(buffer.data(), "getmem", strlen("getmem")) == 0)
{
std::cout << "获取mem参数并返回给服务端." << std::endl;
socket.write_some(boost::asio::buffer("mem: 78 %"));
}
// 判断收到的命令是否为终止程序
if (strncmp(buffer.data(), "exit", strlen("exit")) == 0)
{
std::cout << "终止客户端." << std::endl;
return 0;
}
}
else
{
}
}
}
else
{
std::cout << "连接失败,正在重新连接." << std::endl;
}
}
}
catch (...)
{
return false;
}
std::system("pause");
return 0;
}