5#include <QLoggingCategory>
6#include "BackendFtpServer.h"
7#include "OperateFtpServer.h"
9static Q_LOGGING_CATEGORY(log,
"FtpServer.Backend")
15 qDebug(log) << Q_FUNC_INFO;
17 m_Para = po->GetParameter();
20CBackendFtpServer::~CBackendFtpServer()
22 qDebug(log) << Q_FUNC_INFO;
27 qDebug(log) << Q_FUNC_INFO;
29 qCritical(log) <<
"Server is exist";
30 return OnInitReturnValue::Fail;
36 emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
40 if(!m_Para->GetAnonymousLogin()) {
41 szUser = m_Para->GetUser();
42 szPassword = m_Para->GetPassword();
44 m_pServer =
new CFtpServer(
this, m_Para->GetRoot(), m_Para->GetPort(),
46 m_Para->GetReadOnly());
47 m_pServer->SetFilter(
this);
49 if(m_Para->GetListenAll())
50 bListen = m_pServer->Listening();
52 foreach (
auto a, m_Para->GetListen()) {
54 bListen = m_pServer->Listening(addr);
58 QString szMsg = tr(
"Ftp server listen in %1").arg(m_Para->GetPort());
62 QString szErr = tr(
"Ftp server is not listening in %1").arg(m_Para->GetPort());
64 return OnInitReturnValue::Fail;
66 return OnInitReturnValue::NotUseOnProcess;
71 qDebug(log) << Q_FUNC_INFO;
79bool CBackendFtpServer::onFilter(QSslSocket *socket)
82 if(!socket)
return true;
83 QString szIP = socket->peerAddress().toString();
85 QStringList white = m_Para->GetWhitelist();
86 QStringList black = m_Para->GetBlacklist();
87 bool bInWhite =
false;
88 if(!white.isEmpty()) {
89 foreach(
auto i, white) {
90 QHostAddress addr(szIP);
91 auto sub = QHostAddress::parseSubnet(i);
92 if(addr.isInSubnet(sub.first, sub.second)) {
99 if(!bInWhite && !black.isEmpty()) {
100 foreach(
auto i, black) {
101 QHostAddress addr(szIP);
102 auto sub = QHostAddress::parseSubnet(i);
103 if(addr.isInSubnet(sub.first, sub.second)) {
104 qDebug(log) <<
"Filet" << szIP <<
"in blacklist";
110 if(bFilte)
return true;
112 if(m_Para->GetConnectCount() >= 0 && m_Para->GetConnectCount() <= m_Sockets.size()) {
113 qDebug(log) <<
"Exceeded the allowed number of connections:" << m_Para->GetConnectCount();
118 check = connect(socket, SIGNAL(disconnected()),
119 this, SLOT(slotDisconnected()));
122 quint16 port = socket->peerPort();
123 m_Sockets.append(socket);
125 emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
126 emit sigConnected(szIP, port);
127 qDebug(log) <<
"Current connect count:" << m_Sockets.size()
128 <<
"; new connect from:" << szIP +
":" + QString::number(port);
132void CBackendFtpServer::slotDisconnected()
134 QSslSocket *socket = qobject_cast<QSslSocket*>(sender());
136 m_Sockets.removeAll(socket);
138 emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
139 QString ip = socket->peerAddress().toString();
140 quint16 port = socket->peerPort();
141 emit sigDisconnected(ip, port);
142 qDebug(log) <<
"Current connect count:" << m_Sockets.size()
143 <<
"; remove connect:" << socket->peerAddress().toString();
146void CBackendFtpServer::slotDisconnect(
const QString& szIp, quint16 port)
148 foreach (
auto s, m_Sockets) {
149 if(s->peerAddress().toString() == szIp && s->peerPort() == port){
150 s->disconnectFromHost();
virtual int OnClean() override
清理
virtual OnInitReturnValue OnInit() override
初始化
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
void sigInformation(const QString &szInfo)
从后台线程中触发在主线程中显示信息,不阻塞后台线程
void sigError(const int nError, const QString &szError=QString())
当有错误产生时触发