当前位置: 首页 > news >正文

officeplusseo技术博客

officeplus,seo技术博客,绍兴seo整站优化,长春火车站在哪到官网下载qssh的源码QSsh-botan-1,使用qtcreator打开后,直接编译,即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下,即为库头文件。 qssh有个问题,如果你将qssh的类放在子线程…

到官网下载qssh的源码QSsh-botan-1,使用qtcreator打开后,直接编译,即可得到qssh的库

 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下,即为库头文件。

qssh有个问题,如果你将qssh的类放在子线程中调用,将获取不到服务器发送回来的数据。故只能放在主线程调用。如有需要从子线程调用的话,可通过在子线程发送信号来调用主线程的槽,从而调用到qssh的功能,使得qssh在主线程调用,即能正常使用。

封装如下:

// .h
#ifndef SSHCLIENT_H
#define SSHCLIENT_H
#include <qobject.h>
#include "sshconnection.h"
#include "sshremoteprocess.h"class SshClient : public QObject
{Q_OBJECT
public:SshClient();~SshClient();void ConnectToHost(const QString &host, const QString &user, const QString &pwd);void DisConnectFromHost();void SendCmd(const QByteArray &data);signals:void SendDataRecv(const QByteArray &data);void SendConnected(bool bConned);void SendShellStarted(bool bStarted);void SendRetMsg(const QString &msg);private slots:void OnConnected();void onConnectionError(QSsh::SshError);void OnShellStarted();void OnShellDataRecieved();void OnShellError();private:QString mIp;QString mUserName;QString mPwd;QSsh::SshConnection *mpConnection = Q_NULLPTR; // 连接ssh服务器QSharedPointer<QSsh::SshRemoteProcess> mpShell; // ssh的shell用于发送与回显消息
};#endif // SSHCLIENT_H// .cpp
#include <qcoreapplication.h>
#include "sshclient.h"
#include "log.h"SshClient::SshClient()
{}SshClient::~SshClient()
{DisConnectFromHost();
}void SshClient::ConnectToHost(const QString &host, const QString &username, const QString &pwd)
{QSsh::SshConnectionParameters params;params.setHost(host);params.setUserName(username);params.setPassword(pwd);params.authenticationType = QSsh::SshConnectionParameters::AuthenticationTypePassword;params.timeout = 10;//30;params.setPort(22);if(mpConnection == Q_NULLPTR){mpConnection = new QSsh::SshConnection(params, this); // TODO free this pointer!}connect(mpConnection, SIGNAL(connected()), SLOT(OnConnected()));connect(mpConnection, SIGNAL(error(QSsh::SshError)), SLOT(onConnectionError(QSsh::SshError)));mpConnection->disconnectFromHost();mpConnection->connectToHost();LOG_INFO("conneting to host:%s user:%s pwd:%s",qPrintable(host),qPrintable(username),qPrintable(pwd));
}void SshClient::DisConnectFromHost()
{if(mpShell){emit SendShellStarted(false);mpShell->close();mpShell.reset();}if(mpConnection != Q_NULLPTR){emit SendConnected(false);mpConnection->disconnectFromHost();delete mpConnection;mpConnection = Q_NULLPTR;}
}void SshClient::OnConnected()
{emit SendConnected(true);LOG_INFO("ssh is connected");mpShell = mpConnection->createRemoteShell();connect(mpShell.get(), SIGNAL(started()), SLOT(OnShellStarted()));connect(mpShell.get(), SIGNAL(readyReadStandardOutput()), SLOT(OnShellDataRecieved()));connect(mpShell.get(), SIGNAL(readyReadStandardError()), SLOT(OnShellError()));mpShell->start();
}void SshClient::onConnectionError(QSsh::SshError)
{QString errStr = mpConnection->errorString();emit SendRetMsg(QString::fromLocal8Bit("连接出错:%1").arg(errStr));LOG_ERROR("ssh connected err:%s",mpConnection->errorString().toLocal8Bit().data());//mpConnection->disconnectFromHost();// mpConnection->connectToHost();
}void SshClient::OnShellStarted()
{LOG_INFO("shell is started");SendShellStarted(true);
}void SshClient::OnShellDataRecieved()
{QByteArray data = mpShell->readAll();if (data.isEmpty())return;emit SendDataRecv(data);LOG_DEBUG("recv from shell data:%s",data.data());
}void SshClient::OnShellError()
{emit SendRetMsg(QString::fromLocal8Bit("错误:%1").arg(mpShell->errorString()));LOG_ERROR("recv from shell err:%s",mpShell->errorString().toLocal8Bit().data());
}// 发送了命令后,shell会回复两条同样的命令,用于回显
void SshClient::SendCmd(const QByteArray &data)
{if(!mpShell){LOG_ERROR("shell is not start, can't sendmsg:%s",data.data());return;}qint64 n = mpShell->write(data);LOG_DEBUG("write shell data, len:%d, data:%s",n,data.data());static const int timeoutMs = 3000;int index = 0;bool bsucc = mpShell->waitForReadyRead(10);while(!bsucc && index < timeoutMs){	index += 10;QCoreApplication::processEvents();if (!mpShell) break;bsucc = mpShell->waitForReadyRead(10);} /*if (bsucc){QByteArray data = mpShell->readAll();if (data.isEmpty())return;emit SendDataRecv(data);LOG_DEBUG("recv from shell data:%s", data.data());}*/
}

http://www.yidumall.com/news/71446.html

相关文章:

  • 网站建设进度总结360收录提交
  • 手机免费制作网站东莞企业推广网站制作
  • 做网站靠广告一年赚多少钱windows11优化大师
  • 信和财富网站开发网络推广主要做什么
  • python做网站表白企业seo案例
  • 云南省城乡建设培训中心网站自己的产品怎么推广
  • 网站推广公司排名方案做seo需要投入的成本
  • 常用来做网站的首页百度推广怎么联系
  • 莱州哪有做网站的网站上不去首页seo要怎么办
  • 网站被主流搜索引擎收录的网页数量盐酸达泊西汀片是治疗什么的药物
  • 在线旅游网站建设前的调研高端网站建设公司排行
  • 做网站怎么在图片里面插字北海seo快速排名
  • 安徽省建设造价管理协会网站脑白金网络营销
  • 代做网站作业直通车官网
  • 金融软件网站建设公司seo云优化方法
  • 深圳网站设计公司行业北京seo主管
  • 无锡 电子商务网站建设网站推广做什么
  • 学网站制作重庆seo排名公司
  • wordpress如何自建站网络推广项目计划书
  • 成都学生网站制作网站推广策划书范文
  • 免费直播网站温州seo排名优化
  • 做直播网站用什么语言百度收录申请入口
  • 网站内容管理后台系统怎么做seo按天计费系统
  • wordpress测试数据中文seo线下培训班
  • 网站文章更新要求seo搜索排名优化公司
  • 石家庄做外贸网站百度百度网址大全
  • 安顺网站开发公司最近国际时事热点事件
  • 宜春做网站的联系电话网络营销seo优化
  • 一个公司如何把网站做好b站免费建网站
  • 网站视频下载软件今天刚刚发生的新闻最新新闻