玉兔远程控制 0.0.36
载入中...
搜索中...
未找到
SSHTunnelThread.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include <QThread>
5
6#include "ChannelSSHTunnelForward.h"
7#include "SSHTunnelThread.h"
8
9static Q_LOGGING_CATEGORY(log, "Channel.SSH.Tunnel.Thread")
10
12 : QThread(nullptr),
13 m_pConnect(pConnect),
14 m_bExit(false),
15 m_pParameter(parameter),
16 m_pRemoteNet(remote)
17{
18 qDebug(log) << "CSSHTunnelThread::CSSHTunnelThread";
19 bool check = false;
20 check = connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
21 Q_ASSERT(check);
22}
23
24CSSHTunnelThread::~CSSHTunnelThread()
25{
26 qDebug(log) << "CSSHTunnelThread::~CSSHTunnelThread";
27}
28
29void CSSHTunnelThread::Exit()
30{
31 m_bExit = true;
32}
33
34void CSSHTunnelThread::run()
35{
36 int nRet = 0;
37 qDebug(log) << "CSSHTunnelThread run";
39 m_pParameter, m_pRemoteNet, m_pConnect);
40 if(!p)
41 return;
42
43 do{
44 bool check = connect(p, SIGNAL(sigServer(QString, quint16)),
45 this, SIGNAL(sigServer(QString, quint16)));
46 Q_ASSERT(check);
47 check = connect(p, SIGNAL(sigServer(QString)),
48 this, SIGNAL(sigServer(QString)));
49 Q_ASSERT(check);
50 check = connect(p, SIGNAL(sigError(int,QString)), this,
51 SIGNAL(sigError(int,QString)));
52 Q_ASSERT(check);
53
54 if(!p->open(QIODevice::ReadWrite)) {
55 emit m_pConnect->sigShowMessageBox(
56 tr("Error"), p->errorString(), QMessageBox::Critical);
57 nRet = -1;
58 break;
59 }
60 while (!m_bExit && nRet >= 0) {
61 nRet = p->Process();
62 if(nRet) {
63 qCritical(log) << "Process fail" << p->errorString();
64 break;
65 }
66 }
67
68 p->close();
69 } while(0);
70
71 if(nRet)
72 emit sigError(nRet, p->errorString());
73
74 emit sigDisconnect();
75 p->deleteLater();
76
77 qDebug(log) << "CSSHTunnelThread end";
78}
包括 SSH 隧道和用于转发数据的本地 SOCKET 服务。 实现通过本地 socket 与 SSH 隧道转发数据。适用于库没有实现传输层接口,只有 socket 的情况。
virtual bool open(OpenMode mode) override
连接接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Connect()、 slotTimeOut()、 OnProcess() 。 当然,它仍...
Definition Connect.h:45
void sigShowMessageBox(const QString &szTitle, const QString &szMessage, const QMessageBox::Icon &icon=QMessageBox::Information)
从后台线程中触发在主线程中显示消息对话框(QMessageBox),不阻塞后台线程
网络连接参数接口。此类仅在插件内有效。 其界面为 CParameterNetUI
实现通过本地 SOCKET 与 SSH 隧道转发数据。适用于库没有实现传输层接口,只有 socket 的情况。
void sigServer(QString szHost, quint16 nPort)
当 SOCKET 服务建立监听后触发,用于通知其它本地 SOCKET 可以连接它