📄 connectsocket.cpp
字号:
switch(nResult)
{
case 1:
SendResponse("550 Permission denied");
break;
case 2:
SendResponse("550 File not found");
break;
default:
{
CFileStatus status;
CFile::GetStatus(strResult, status);
CString strResponse;
strResponse.Format("213 %d", status.m_size);
SendResponse(strResponse);
break;
}
}
}
break;
// delete file
case TOK_DELE:
{
CString strResult;
int nResult = theServer.m_UserManager.GetFileName(m_strUserName, strArguments, m_strCurrentDir, FTP_DELETE, strResult);
switch(nResult)
{
case 1:
SendResponse("550 Permission denied");
break;
case 2:
SendResponse("550 File not found");
break;
default:
try
{
CFile::Remove(strResult);
}
catch(CFileException *e)
{
e->Delete();
SendResponse("450 Internal error deleting the file.");
break;
}
SendResponse("250 File deleted successfully");
break;
}
}
break;
// remove directory
case TOK_RMD:
{
CString strResult;
int nResult = theServer.m_UserManager.GetDirectory(m_strUserName, strArguments, m_strCurrentDir, FTP_DELETE, strResult);
switch(nResult)
{
case 1:
SendResponse("550 Permission denied");
break;
case 2:
SendResponse("550 Directory not found");
break;
default:
if (!RemoveDirectory(strResult))
{
if (GetLastError() == ERROR_DIR_NOT_EMPTY)
SendResponse("550 Directory not empty.");
else
SendResponse("450 Internal error deleting the directory.");
}
else
{
SendResponse("250 Directory deleted successfully");
}
break;
}
}
break;
// create directory
case TOK_MKD:
{
CString strResult;
int nResult = theServer.m_UserManager.GetDirectory(m_strUserName, strArguments, m_strCurrentDir, FTP_CREATE_DIR, strResult);
switch(nResult)
{
case 0:
SendResponse("550 Directory already exists");
break;
case 1:
SendResponse("550 Can't create directory. Permission denied");
break;
case 3:
SendResponse("550 Directoryname not valid");
break;
default:
strResult += "\\";
CString strDir;
BOOL bResult;
// create directory structure one part at a time
while (strResult != "")
{
strDir += strResult.Left(strResult.Find("\\")+1);
strResult = strResult.Mid(strResult.Find("\\")+1);
bResult = CreateDirectory(strDir, 0);
}
if (!bResult)
{
SendResponse("450 Internal error creating the directory.");
}
else
SendResponse("250 Directory created successfully");
break;
}
}
break;
// rename file or directory (part 1)
case TOK_RNFR:
{
CString strResult;
int nResult = theServer.m_UserManager.GetFileName(m_strUserName, strArguments, m_strCurrentDir, FTP_RENAME, strResult);
if (nResult == 0)
{
m_strRenameFile = strResult;
m_bRenameFile = TRUE;
SendResponse("350 File exists, ready for destination name.");
break;
}
else
{
// client wants to rename directory
nResult = theServer.m_UserManager.GetDirectory(m_strUserName, strArguments, m_strCurrentDir, FTP_RENAME, strResult);
switch(nResult)
{
case 0:
m_strRenameFile = strResult;
m_bRenameFile = FALSE;
SendResponse("350 Directory exists, ready for destination name.");
break;
case 1:
SendResponse("550 Permission denied");
break;
default:
SendResponse("550 file/directory not found");
break;
}
}
}
break;
// rename file or directory (part 2)
case TOK_RNTO:
{
if (m_strRenameFile.IsEmpty())
{
SendResponse("503 Bad sequence of commands!");
break;
}
if (m_bRenameFile)
{
CString strResult;
// check destination filename
int nResult = theServer.m_UserManager.GetFileName(m_strUserName, strArguments, m_strCurrentDir, FTP_RENAME, strResult);
switch(nResult)
{
case 0:
SendResponse("550 file exists");
break;
case 1:
SendResponse("550 Permission denied");
break;
default:
if (!MoveFile(m_strRenameFile, strResult))
SendResponse("450 Internal error renaming the file");
else
SendResponse("250 file renamed successfully");
break;
}
}
else
{
CString strResult;
// check destination directory name
int nResult = theServer.m_UserManager.GetDirectory(m_strUserName, strArguments, m_strCurrentDir, FTP_RENAME, strResult);
switch(nResult)
{
case 0:
SendResponse("550 directory exists");
break;
case 1:
SendResponse("550 Permission denied");
break;
case 3:
SendResponse("550 Filename invalid");
break;
default:
if (!MoveFile(m_strRenameFile, strResult))
SendResponse("450 Internal error renaming the file");
else
SendResponse("250 file renamed successfully");
break;
}
}
}
break;
// abort transfer
case TOK_ABOR:
{
if (m_TransferStatus.m_pDataSocket)
{
if (m_TransferStatus.m_pDataSocket->GetStatus() != XFERMODE_IDLE)
SendResponse("426 Connection closed; transfer aborted.");
// destroy data socket
m_pThread->PostThreadMessage(WM_THREADMSG, 0, 0);
// DestroyDataSocket();
}
SendResponse("226 ABOR command successful");
break;
}
// get system info
case TOK_SYST:
SendResponse("215 UNIX emulated by Pablo's FTP Server");
break;
// close connection
case TOK_BYE:
case TOK_QUIT:
{
// send goodbye message to client
CConnectThread *pThread = (CConnectThread *)m_pThread;
CString strText = ((CFTPServer *)pThread->m_pWndServer)->GetGoodbyeMessage();
SendResponse("220 " + strText);
Close();
// tell our thread we have been closed
// destroy connection
m_pThread->PostThreadMessage(WM_THREADMSG, 1, 0);
break;
}
// dummy instruction
case TOK_NOOP:
SendResponse("200 OK");
break;
default:
SendResponse("502 Command not implemented.");
break;
}
}
/********************************************************************/
/* */
/* Function name: FireStatusMessage */
/* Description : Fire status message. */
/* */
/********************************************************************/
void CConnectSocket::FireStatusMessage(LPCTSTR lpszStatus, int nType)
{
CConnectThread *pThread = (CConnectThread *)m_pThread;
((CFTPServer *)pThread->m_pWndServer)->AddTraceLine(nType, "[%d] %s", m_pThread->m_nThreadID, lpszStatus);
}
/********************************************************************/
/* */
/* Function name: DestroyDataSocket */
/* Description : Close data transfer socket. */
/* */
/********************************************************************/
void CConnectSocket::DestroyDataSocket()
{
if (!m_TransferStatus.m_pDataSocket)
return;
// m_TransferStatus.m_pDataSocket->Close();
delete m_TransferStatus.m_pDataSocket;
// reset transfer status
m_TransferStatus.m_pDataSocket = NULL;
m_TransferStatus.m_strRemoteHost = "";
m_TransferStatus.m_nRemotePort = -1;
m_TransferStatus.m_bPassiveMode = FALSE;
m_TransferStatus.m_nRest = -1;
}
char *CConnectSocket::GetResponseMessage(int nResponse)
{
switch(nResponse)
{
case 110 : return "Restart marker reply"; break;
case 120 : return "Service ready in nnn minutes."; break;
case 125 : return "Data connection already open; transfer starting."; break;
case 150 : return "File status okay; about to open data connection."; break;
case 200 : return "Command okay."; break;
case 202 : return "Command not implemented, superfluous at this site."; break;
case 211 : return "System status, or system help reply."; break;
case 212 : return "Directory status."; break;
case 213 : return "File status."; break;
case 214 : return "Help message."; break;
case 215 : return "NAME system type."; break;
case 220 : return "Service ready for new user."; break;
case 221 : return "Service closing control connection."; break;
case 225 : return "Data connection open; no transfer in progress."; break;
case 226 : return "Closing data connection successfully."; break;
case 227 : return "Entering Passive Mode (h1,h2,h3,h4,p1,p2)."; break;
case 230 : return "User logged in, proceed."; break;
case 250 : return "Requested file action okay, completed."; break;
case 257 : return "PATHNAME created."; break;
case 331 : return "User name okay, need password."; break;
case 332 : return "Need account for login."; break;
case 350 : return "Requested file action pending further information."; break;
case 421 : return "Service not available, closing control connection."; break;
case 425 : return "Can't open data connection."; break;
case 426 : return "Connection closed; transfer aborted."; break;
case 450 : return "Requested file action not taken - File unavailable."; break;
case 451 : return "Requested action aborted: local error in processing."; break;
case 452 : return "Requested action not taken - Insufficient storage space in system."; break;
case 500 : return "Syntax error, command unrecognized."; break;
case 501 : return "Syntax error in parameters or arguments."; break;
case 502 : return "Command not implemented."; break;
case 503 : return "Bad sequence of commands."; break;
case 504 : return "Command not implemented for that parameter."; break;
case 530 : return "Not logged in."; break;
case 532 : return "Need account for storing files."; break;
case 550 : return "Requested action not taken - File unavailable."; break;
case 551 : return "Requested action aborted: page type unknown."; break;
case 552 : return "Requested file action aborted - Exceeded storage allocation"; break;
case 553 : return "Requested action not taken - File name not allowed."; break;
default : return "Unknown error";
}
}
void CConnectSocket::Shutdown(int nReason)
{
DestroyDataSocket();
switch(nReason)
{
case 1:
SendResponse("421 Connection timed out.");
break;
case 2:
SendResponse("421 No-transfer-time exceeded. Closing control connection.");
break;
case 3:
SendResponse("421 Login time exceeded. Closing control connection.");
break;
case 4:
SendResponse("421 Kicked by Administrator");
break;
case 5:
SendResponse("421 Problem with server");
break;
default:
SendResponse("421 Server is going offline");
break;
}
FireStatusMessage("disconnected.", 0);
Close();
// tell our thread we have been closed
// m_pThread->PostThreadMessage(WM_QUIT,0,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -