⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connectsocket.cpp

📁 It can also accept a number of ftp connection (multithreaded), and with most of the commercial ftp s
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			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 + -