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

📄 ftpclient.cs

📁 用C#写的FTP客户端
💻 CS
📖 第 1 页 / 共 4 页
字号:
/*	Project		:	FTPExplorer
 *	File Name	:	FTPClient.cs
 *	Purpose		:	Class to handle FTP Control and Data Connection
 *	Author		:	K.Niranjan Kumar
 *	Date		:	07/05/2001
 *	Company		:	Cognizant Technology Solutions.
 *	e-Mail		:	KNiranja@chn.cognizant.com
 */
namespace FTPExplorer
{
    using System;
	using System.Net.Sockets;
	using System.IO;
	using System.Net;
	using System.Text;

	enum g_enumConnStat { NOTCONN = 0 ,CONNECTED = 1, UNKNOWN = 2 };


    /// <summary>
    ///    Summary description for FTPClient.
    /// </summary>
    public class FTPClient
    {
		/*	Socket members for Command Connection */
		private Socket m_ClientSocket;
		private IPEndPoint m_IPServer;
		private IPAddress m_hostAddress;
		
		private int m_iSendTimeout;
		private int m_iRecvTimeout;

		public string m_strCommands;
		public string m_strServerType;
		public string m_strSystemStatus;

		private string m_strFTPAddress,m_strUser,m_strPassword;
		private int m_iFTPPort;

		private string m_strErrorMessage;
		private g_enumConnStat m_eConnStat = 0;
		private int m_iServerOS;
		
		public string m_strList;

		private FileList m_FileList;

		private string m_strRootDir;		/*	Root Directory	*/
		private string m_strCurrentWorkingDir;		/*	Current working directory	*/
		private int m_iDataPort;			/*	Generates Port No for data connection */
		private char m_chDataTransferMode;
		private	ExplorerDlg m_ParentWindow;			/*	Handle to parent window	*/

		public ExplorerDlg ParentWindow {
			set {
				m_ParentWindow = value;
			}
		}

        public FTPClient()
        {
            //
            // TODO: Add Constructor Logic here
            //
			m_ClientSocket = null;
			m_strFTPAddress = "";
			m_strUser = "";
			m_strPassword = "";
			m_strErrorMessage = "";
			m_eConnStat = g_enumConnStat.NOTCONN;

			m_iSendTimeout = 1000;		/*	Timeout for Send() 1000 ms	*/
			m_iRecvTimeout = 3000;		/*	Timeout for Receive() 300 ms	*/
			m_strSystemStatus = "";
			/*	Default FTP Port */
			m_iFTPPort = 21;

			m_strList = "";
			
			/*	Unknown OS */
			m_iServerOS = 0;

			m_FileList = new FileList();

			m_strRootDir = "";
			m_strCurrentWorkingDir = "";

			m_iDataPort = 13000;	/*	Start with 10000 */
			m_chDataTransferMode = 'A';		/*	Default mode of Data Transfer	*/
		}

		/*	Property Name	:	DataTransferMode 
		 *	Purpose			:	Determines mode of data transfer for RETR and STOR commands
		 *	Possible Values	:	'A' for ASCII, 'B' for Binary
		 * */
		public char DataTransferMode {
			set {
				m_chDataTransferMode = value;
			}
			get {
				return m_chDataTransferMode;
			}
		}

		private void CloseConnection(){
			if ( m_ClientSocket != null ) {
				m_ClientSocket.Shutdown(SocketShutdown.SdBoth);
				m_ClientSocket.Close();
				m_ClientSocket = null;
			}
			return;
		}
		
		public int Connect(){
			return Connect(m_strFTPAddress,m_strUser,m_strPassword);
		}

		public int Connect(string l_strFTPAddress,string l_strUser,string l_strPassword){
			m_strFTPAddress = l_strFTPAddress;
			m_strUser = l_strUser;
			m_strPassword = l_strPassword;
			if ( m_strFTPAddress.Length == 0 ) {
				m_strErrorMessage = "Error : FTP Server Address is empty";
				return 0;
			}
			if ( m_strUser.Length == 0 ) {
				m_strErrorMessage = "Error : FTP User ID is empty";
				return 0;
			}
			if ( m_strPassword.Length == 0 ) {
				m_strErrorMessage = "Error : FTP Password is empty";
				return 0;
			}

			try {

				/*	Create Socket here */
				m_ClientSocket = new Socket(AddressFamily.AfINet,SocketType.SockStream,ProtocolType.ProtTCP);

				/*	Resolve IP address here */
				m_hostAddress = DNS.Resolve(m_strFTPAddress);
				m_IPServer = new IPEndPoint(m_hostAddress,21);

				m_ClientSocket.SetSockOpt(SocketOption.SolSocket,SocketOption.SoRcvTimeo,m_iRecvTimeout);
				m_ClientSocket.SetSockOpt(SocketOption.SolSocket,SocketOption.SoSndTimeo,m_iSendTimeout);
				
				/*	Connect to FTP Server */
				if ( m_ClientSocket.Connect(m_IPServer) != 0 ) {
					m_strErrorMessage = "Error : Unable to connect to host on specified port";
					m_eConnStat = g_enumConnStat.NOTCONN;
					return 0;
				}

				Byte[] l_bRecvData = new Byte[255];
				//Byte[] l_bSendData = new Byte[255];

				int l_iRetval = 0;
				string l_strResponseData = "";
				/*	Get Response data */
				l_iRetval = m_ClientSocket.Receive(l_bRecvData,254,0);
				if ( l_iRetval == 0 ) {
					m_strErrorMessage = "Error : Error while connecting to FTP Server, Connection closed";
					return l_iRetval;
				}
				else if ( l_iRetval == -1 ) {
					m_strErrorMessage = "Error : Error while connecting to FTP Server, Invalid Socket";
					return 0;
				}
				else {
					l_strResponseData = Encoding.ASCII.GetString(l_bRecvData,0,l_iRetval);
				}

				string l_strResponseCode = l_strResponseData.Substring(0,3);
				l_iRetval = ParseResponseCode("CONNECT",l_strResponseCode);
				/*	Check for status of FTP server */
				if ( l_iRetval == 1 ) {

					/*	Login to FTP Server*/
					if ( Login() == 1 ){
						/*	Successfully connected */
						m_eConnStat = g_enumConnStat.CONNECTED;
					}
					else {
						//m_strErrorMessage = "1Error : " + l_strResponseData;
						m_eConnStat = g_enumConnStat.NOTCONN;
						return 0;
					}
				}
				else {
					m_strErrorMessage = "Error : " + l_strResponseData;
					m_eConnStat = g_enumConnStat.NOTCONN;
					return 0;
				}
			}
			catch ( SocketException e) {
				m_strErrorMessage = "Error : " + e;
				m_eConnStat = g_enumConnStat.NOTCONN;
				return 0;
			}
			finally {
				/*	If error in connection, then close the socket */
				if ( m_eConnStat != g_enumConnStat.CONNECTED ) {
					CloseConnection();
				}
			}
			return 1;
		}

		/*	Logon to FTP Server, Set the root directory to m_strRootDir
		 * */
		private int Login(){

			if ( m_ClientSocket == null ) {
				m_strErrorMessage = "Error : Sockets not initialised";
				return 0;
			}

			string l_strCommand = "";
			string l_strOutput = "";
			int l_iRetval = 0;

			m_strErrorMessage = "";

			/*	USER command */
			l_strCommand = "USER " + m_strUser + "\r\n";
			l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
			if ( l_iRetval == 0 ) {
				CloseConnection();
				return l_iRetval;	
			}
			/*	Set Message in the parent window */
			m_ParentWindow.SetStausMessage("Verifying Password...");

			m_strErrorMessage = "";
			/*	PASS command */
			l_strOutput = "";
			l_strCommand = "PASS " + m_strPassword + "\r\n";
			l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
			if ( l_iRetval == 0 ) {
				CloseConnection();
				return 0;	
			}
			/*	Set Message in the parent window */
			m_ParentWindow.SetStausMessage("Analysing Server Operating System...");

			m_strErrorMessage = "";
			/*	SYST */
			l_strOutput = "";
			l_strCommand = "SYST\r\n";
			l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
			if ( l_iRetval == 0 ) {
				CloseConnection();
				return l_iRetval;
			}

			m_strServerType = l_strOutput;
			if ( l_strOutput == null || l_strOutput.Length == 0 ) {
				m_strErrorMessage = "Error in response for SYST command";
				return 0;
			}

			string lstr_temp1 = m_strServerType.Remove(0,4);
			string lstr_temp = lstr_temp1.Substring(0,4);
			if ( lstr_temp == "UNIX" ) {
				m_iServerOS = 1;
			}
			else if ( lstr_temp == "Wind" ) {
				m_iServerOS = 2;
			}
			else {
				m_iServerOS = 3;
				/*	Currently not supported */
				m_strErrorMessage = "FTP Explorer Beta 1 supports browsing only on Windows and Unix based FTP Services. FTP browsing on other FTP services will be enabled in future versions.";
				CloseConnection();
				return 0;
			}

			m_strServerType = lstr_temp1;
			/*	Set Message in the parent window */
			m_ParentWindow.SetStausMessage("Querying for working directory...");
			
			/*	Get the current working directory */
			/*	PWD */
			l_strOutput = "";
			l_strCommand = "PWD\r\n";
			l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
			if ( l_iRetval == 0 ) {
				CloseConnection();
				return l_iRetval;	
			}
			string l_strRootDir = ParseForPWD(l_strOutput);
			m_strCurrentWorkingDir = m_strRootDir = l_strRootDir;
			m_strSystemStatus = l_strOutput;

			/*	Set Message in the parent window */
			m_ParentWindow.SetStausMessage("Setting to Stream Mode...");

			/*	MODE command, Set Mode = Stream */
			l_strOutput = "";
			l_strCommand = "MODE S\r\n";
			l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
			if ( l_iRetval == 0 ) {
				return 0;
			}

			/*	Set Message in the parent window */
			m_ParentWindow.SetStausMessage("Setting to Ascii Type...");

			/*	TYPE command, Set Type = ASCII */
			l_strCommand = "TYPE A\r\n";
			l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
			if ( l_iRetval == 0 ) {
				return 0;
			}
			return l_iRetval;
		}

		public int Disconnect(){
			if ( m_ClientSocket == null ) {
				m_strErrorMessage = "Error : Sockets not initialised";
				return 0;
			}

			string l_strCommand = "QUIT\r\n";
			string l_strOutput = "";
			
			int l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
/*			currently don't bother about Quit command response
 * 			string l_strResponseCode = l_strOutput.Substring(0,3);
			l_iRetval = ParseResponseCode("QUIT",l_strResponseCode);
			if ( l_iRetval == 0 ) {
				return 0;
			}
*/
			/*	Close socket handle here */
			CloseConnection();
			m_ClientSocket = null;
			return 1;
		}

		public void SetFTPServerAddress(string l_strServerAddress){
			m_strFTPAddress = l_strServerAddress;
		}

		public string GetFTPServerAddress(){
			return m_strFTPAddress;
		}

		public void SetFTPUser(string l_strFTPUser){
			m_strUser = l_strFTPUser;
		}

		public string GetFTPUser(){
			return m_strUser;
		}

		public void SetFTPPassword(string l_strPassword){
			m_strPassword = l_strPassword;
		}

		public string GetFTPPassword(){
			return m_strPassword;
		}
		public void SetFTPPort(int l_iPort){
			m_iFTPPort = l_iPort;
		}

		public int GetFTPPort(){
			return m_iFTPPort;
		}

		public void SetTimeOuts(int l_iSendTimeOut,int l_iRecvTimeOut ){
			m_iSendTimeout = l_iSendTimeOut;
			m_iRecvTimeout = l_iRecvTimeOut;
			return ;
		}

		public void GetTimeOuts(out int l_outiSendTimeOut,out int l_outiRecvTimeOut ){
			l_outiSendTimeOut = m_iSendTimeout;
			l_outiRecvTimeOut = m_iRecvTimeout;
			return ;
		}

		public int GetFTPStatus(){
			int l_iRetVal = 0;
			switch(m_eConnStat) {
				case g_enumConnStat.NOTCONN :
					l_iRetVal = 0;
					break;
				case g_enumConnStat.CONNECTED :
					l_iRetVal = 1;
					break;
				case g_enumConnStat.UNKNOWN :
					l_iRetVal = 2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -