#include "ftpdatasocket.h"
FTPDataSocket::FTPDataSocket(int SocketDescriptor, QObject *parent) :
QObject(parent)
{
try
{
LoadResponses();
LoadSettings();
mSessionID = SocketDescriptor;
mSocket = new QTcpSocket(this);
if(!mSocket->setSocketDescriptor(mSessionID))
{
qDebug() << mSessionID << " Error binding socket";
return;
}
//connect the signals
connect(mSocket,SIGNAL(readyRead()),this,SLOT(SocketReadyRead()),Qt::DirectConnection);
connect(mSocket,SIGNAL(disconnected()),this,SLOT(SocketDisconnected()),Qt::DirectConnection);
qDebug() << mSessionID << " session Connected";
//Send the banner
SendResponse(GetResponse(220));
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in Constructor()");
}
}
void FTPDataSocket::LoadResponses()
{
try
{
mResponseCodes.insert(110,"Restart marker reply.");
mResponseCodes.insert(120,"Service ready in nnn minutes.");
mResponseCodes.insert(125,"Data connection already open; transfer starting.");
mResponseCodes.insert(150,"File status okay; about to open data connection.");
mResponseCodes.insert(200,"Command okay.");
mResponseCodes.insert(202,"Command not implemented, superfluous at this site.");
mResponseCodes.insert(211,"System status, nothing to report.");
mResponseCodes.insert(212,"Directory status.");
mResponseCodes.insert(213,"End of status.");
mResponseCodes.insert(214,"Help command successful.");
mResponseCodes.insert(215,"NAME system type.");
mResponseCodes.insert(220,"Service ready for new user.");
mResponseCodes.insert(221,"Service closing control connection.");
mResponseCodes.insert(225,"Data connection open; no transfer in progress.");
mResponseCodes.insert(226,"Closing data connection.");
mResponseCodes.insert(227,"Entering Passive Mode (h1,h2,h3,h4,p1,p2).");
mResponseCodes.insert(230,"User logged in, proceed.");
mResponseCodes.insert(250,"Requested file action okay, completed.");
mResponseCodes.insert(257,"Path was created.");
mResponseCodes.insert(331,"Password required.");
mResponseCodes.insert(332,"Need account for login.");
mResponseCodes.insert(350,"Requested file action pending further information.");
mResponseCodes.insert(421,"Service not available, closing control connection.");
mResponseCodes.insert(425,"Can't open data connection.");
mResponseCodes.insert(426,"Connection closed; transfer aborted.");
mResponseCodes.insert(450,"Requested file action not taken.");
mResponseCodes.insert(451,"Requested action aborted: local error in processing.");
mResponseCodes.insert(452,"Requested action not taken.");
mResponseCodes.insert(500,"Syntax error, command unrecognized.");
mResponseCodes.insert(501,"Syntax error in parameters or arguments.");
mResponseCodes.insert(502,"Command not implemented.");
mResponseCodes.insert(503,"Bad sequence of commands.");
mResponseCodes.insert(504,"Command not implemented for that parameter.");
mResponseCodes.insert(530,"Not logged in.");
mResponseCodes.insert(532,"Need account for storing files.");
mResponseCodes.insert(550,"Requested action not taken.");
mResponseCodes.insert(551,"Requested action aborted: page type unknown.");
mResponseCodes.insert(552,"Requested file action aborted.");
mResponseCodes.insert(553,"Requested action not taken.");
mResponseCodes.insert(550,"The filename, directory name, or volume label syntax is incorrect.");
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in LoadResponses()");
}
}
void FTPDataSocket::CreateFileSocket()
{
try
{
//Create the file socket
mFileSocket = new FTPFileSocket(this);
//Connect the events
connect(mFileSocket,SIGNAL(OnConnected()),this,SLOT(OnFileConnected()));
connect(mFileSocket,SIGNAL(OnDisconnected()),this,SLOT(OnFileDisconnected()));
connect(mFileSocket,SIGNAL(OnError(QString)),this,SLOT(OnFileError(QString)));
connect(mFileSocket,SIGNAL(OnFinished()),this,SLOT(OnFileFinished()));
connect(mFileSocket,SIGNAL(OnListening()),this,SLOT(OnFileListening()));
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in CreateFileSocket()");
}
}
void FTPDataSocket::SocketReadyRead()
{
try
{
//Append to the command buffer
mCommandBuffer.append(mSocket->readAll());
//Check to see if it is the end of line
if(mCommandBuffer.endsWith('\n'))
{
ProcessCommand(mCommandBuffer);
mCommandBuffer.clear();
}
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in SocketReadyRead()");
}
}
void FTPDataSocket::SocketDisconnected()
{
try
{
qDebug() << mSessionID << "************************ DISCONNECTED **************************";
//Cleanup
mSocket->deleteLater();
this->deleteLater();
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in SocketDisconnected()");
}
}
void FTPDataSocket::SendResponse(const char* data)
{
try
{
SendResponse(QString::fromLatin1(data));
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in SendResponse()");
}
}
void FTPDataSocket::SendResponse(QString data)
{
try
{
SendResponse(data.toLatin1());
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in SendResponse()");
}
}
void FTPDataSocket::SendResponse(int ResponseCode)
{
try
{
SendResponse(GetResponse(ResponseCode));
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in SendResponse()");
}
}
void FTPDataSocket::SendResponse(int ResponseCode, QString ResponseText)
{
try
{
QString ret = QString::number(ResponseCode) + " " + ResponseText + "\r\n";
SendResponse(ret);
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in SendResponse()");
}
}
void FTPDataSocket::SendResponse(QByteArray data)
{
try
{
qDebug() << "Server: " << data;
//Send the data to the client
mSocket->write(data);
//mSocket->waitForBytesWritten();
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in SendResponse()");
}
}
void FTPDataSocket::CloseSocket()
{
try
{
// mSocket->waitForBytesWritten();
mSocket->close();
}
catch(QString err)
{
SendResponse(550,err);
}
catch(...)
{
SendResponse(550,"Unknown error in CloseSocket()");
}
}
int FTPDataSocket::ID()
{
return mSessionID;
}
QString FTPDataSocket::GetResponse(int ResponseCode)
{
QString ret = "";
try
{
if(mResponseCodes.contains(ResponseCode))
{
qt 实现ftp服务器源码
4星 · 超过85%的资源 需积分: 48 181 浏览量
2018-03-09
11:00:29
上传
评论 9
收藏 25KB RAR 举报
半宛清愁
- 粉丝: 66
- 资源: 28
- 1
- 2
前往页