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

📄 ftpclient.cs

📁 ftp浏览器
💻 CS
📖 第 1 页 / 共 4 页
字号:
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
using System.Threading;
using System.Xml;
using System.Data;
using System.Diagnostics;

namespace NiranjanFTP
{
	/// <summary>
	/// Summary description for FTPClient.
	/// </summary>
	public class FTPClient
	{
		private string m_strFTPServer;
		private string m_strUserID;
		private string m_strPassword;
		private string m_strError;
		private int m_iPort;
		private int m_iRecvTimeOut;
		private int m_iSendTimeOut;
		
		private string m_strServerType;
		private int m_iServerOS;
		private string m_strRootDir;
		private string m_strCurrentWorkingDir;
		private string m_strLocalWorkingDir;
		private int m_iDataPort;
		private char m_chTransferType;

		private Socket m_ClientSocket;

		public string ErrorMessage {
			get {
				string l_strTemp = "Error : " + m_strError;
				return  l_strTemp; 
			}
		}

		public int ServerOS {
			get { return m_iServerOS;}
		}

		/// <summary>
		/// No argument constructor
		/// </summary>
		public FTPClient()
		{
			//
			// TODO: Add constructor logic here
			//
			m_strFTPServer = "";
			m_strUserID = "";
			m_strPassword = "";
			m_iPort = 21;
			m_iSendTimeOut = 1000;
			m_iRecvTimeOut = 3000;
			
			m_strServerType = "";
			m_iServerOS = 0;
			m_iDataPort = 12000;
			m_strRootDir = "";
			m_strCurrentWorkingDir = "";
			m_strLocalWorkingDir = "";
			m_chTransferType = 'A';
		}

		/// <summary>
		/// Overloaded constructor that initializes all parameters of a socket connection
		/// </summary>
		/// <param name="l_strFTPServer">FTP Server Name or IP address</param>
		/// <param name="l_strUserID">FTP User Id</param>
		/// <param name="l_strPassword">Password</param>
		/// <param name="l_iPort">FTP Port</param>
		/// <param name="l_iSendTimeOut">Send timeout in milli seconds</param>
		/// <param name="l_iRecvTimeOut">Recv timeout in milli seconds</param>
		public FTPClient(string l_strFTPServer,string l_strUserID, string l_strPassword,int l_iPort,int l_iSendTimeOut,int l_iRecvTimeOut){
			m_strError = "";
			m_strFTPServer = l_strFTPServer;
			m_strUserID = l_strUserID;
			m_strPassword = l_strPassword;
			m_iPort = l_iPort;
			m_iSendTimeOut = l_iSendTimeOut;
			m_iRecvTimeOut = l_iRecvTimeOut;
			m_strServerType = "";
			m_iServerOS = 0;
			m_iDataPort = 12000;
			m_strRootDir = "";
			m_strCurrentWorkingDir = "";
			m_strLocalWorkingDir = "";
			m_chTransferType = 'A';
		}

		public string FTPServer {
			get { return m_strFTPServer;}
			set { m_strFTPServer = value;}
		}

		public string UserID {
			get { return m_strUserID;}
			set { m_strUserID = value;}
		}

		public string Password {
			get { return m_strPassword;}
			set { m_strPassword = value;}
		}
		
		public int Port {
			get { return m_iPort;}
			set { m_iPort = value;}
		}

		public int SendTimeOut {
			get { return m_iSendTimeOut;}
			set { m_iSendTimeOut = value;}
		}
		
		public int RecvTimeOut {
			get { return m_iRecvTimeOut;}
			set { m_iRecvTimeOut = value;}
		}

		/// <summary>
		/// Root directory of FTP Server
		/// </summary>
		public string RootDirectory {
			get { return m_strRootDir;}
		}

		/// <summary>
		/// Current Working directory in FTP Server
		/// </summary>
		public string CurrentDirectory {
			get { return m_strCurrentWorkingDir;}
		}

		/// <summary>
		/// Transfer mode
		/// </summary>
		public char TransferMode {
			get { return m_chTransferType;}
			set { m_chTransferType = value;}
		}

		/// <summary>
		/// Current Local Working directory
		/// </summary>
		public string LocalWorkingDirectory {
			get { return m_strLocalWorkingDir;}
			set { m_strLocalWorkingDir = value;}
		}

		/// <summary>
		/// Connects to FTP Server and authenticates the user
		/// </summary>
		/// <returns>1 if success, else 0</returns>
		public int Connect(){
			if ( m_strFTPServer == ""){
				m_strError = "FTP Server is empty";
				return 0;
			}
			if ( m_strUserID == ""){
				m_strError = "User ID is empty";
				return 0;
			}
			if ( m_strPassword == ""){
				m_strError = "Password is empty";
				return 0;
			}

			try {
				/*	Resolve IP address here */
				IPEndPoint l_IPServer;
				IPHostEntry l_hostAddress;

				l_hostAddress = Dns.Resolve(m_strFTPServer);
				IPAddress l_IPAddress = l_hostAddress.AddressList[0];
				l_IPServer = new IPEndPoint(l_IPAddress,m_iPort);

				/* Create the Socket */
				m_ClientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
				
				/* Set Socket Options */
				m_ClientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout,m_iRecvTimeOut);
				m_ClientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout,m_iSendTimeOut);

				/* Connect to FTP Server */
				m_ClientSocket.Connect(l_IPServer);

				/* Receive acknowledgement message */
				string l_strResponseData = "";
				Byte[] l_bRecvData = new Byte[256];
				l_bRecvData.Initialize();

				/*	Get Response data */
				int l_iRetval = m_ClientSocket.Receive(l_bRecvData);
				if ( l_iRetval == 0 ) {
					m_strError = "Error while connecting to FTP Server, Connection closed by remote host";
					return 0;
				}
				else if ( l_iRetval == -1 ) {
					m_strError = "Error while connecting to FTP Server, Invalid Socket";
					return 0;
				}
				else {
					l_strResponseData = Encoding.ASCII.GetString(l_bRecvData,0,l_iRetval);
				}
				
				/* Check for Server Response */
				string l_strResponseCode = l_strResponseData.Substring(0,3);
				l_iRetval = ParseResponseCode("CONNECT",l_strResponseCode);
				if ( l_iRetval == 0 ){
					m_strError = "Error while connecting to FTP Server : " + l_strResponseData.Substring(4,l_iRetval);
					return 0;
				}

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

				/* USER Command */
				l_strCommand = "USER " + m_strUserID + "\r\n";
				l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
				if ( l_iRetval == 0 ) {
					m_strError = "Error while validating User ID :" + l_strOutput.Substring(4);
					return 0;	
				}

				/*	PASS command */
				l_strOutput = "";
				l_strCommand = "PASS " + m_strPassword + "\r\n";
				l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
				if ( l_iRetval == 0 ) {
					m_strError = "Error while authenticating your password :" + l_strOutput.Substring(4);
					return 0;	
				}

				/*	SYST command */
				l_strOutput = "";
				l_strCommand = "SYST\r\n";
				l_iRetval = ExecuteCommand(l_strCommand,ref l_strOutput);
				if ( l_iRetval == 0 ) {
					CloseConnection();
					return 0;
				}
				
				m_strServerType = l_strOutput;
				if ( l_strOutput == null || l_strOutput.Length == 0 ) {
					m_strError = "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_strError = "This version of FTP Explorer 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;
				}

				/*	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;

				/*	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;
				}

				/*	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 1;
			}
			catch ( Exception e){
				m_strError = e.Message;
				return 0;
			}
		}

		/// <summary>
		/// Parses the output of PWD command
		/// </summary>
		/// <param name="l_strInput">Output string from PWD Command </param>
		/// <returns>The current Directory</returns>
		private string ParseForPWD(string l_strInput){
			int l_iCount = 0;
			int l_iLen = l_strInput.Length;
			string l_strOutput = "";
			for ( ; l_iCount < l_iLen ; l_iCount++) {
				if ( l_strInput[l_iCount] == '"' ){
					for ( l_iCount++ ; l_iCount < l_iLen && l_strInput[l_iCount] != '"' ; l_iCount++) {
						l_strOutput += l_strInput[l_iCount];
					}
				}
			}
			return l_strOutput;
		}

		/// <summary>
		/// Parses output code
		/// </summary>
		/// <param name="l_strResponseData">Response data </param>
		/// <returns>1 if success, else 0</returns>
		private int ParseResponseCode(string l_strCommand,string l_strResponseCode){
			
			int l_iResponseCode = 0, l_iRetval = 0;
			try {
				
				if ( l_strResponseCode.Length > 0 ) {
					l_iResponseCode = int.Parse(l_strResponseCode);
				}
			}
			catch ( FormatException e ) {
				m_strError = "Unrecognized Response code from Server" ;
				return 0;
			}

			/*	421 Error is trapped as a common error */
			if ( l_iResponseCode == 421 ) {
				m_strError = "Service not available, closing control connection. Please try after some time" ;
				return 0;
			}

			if ( l_iResponseCode == 200 || l_iResponseCode == 226 ) {
				return 1;
			}

			/*	If connect Command */
			if ( l_strCommand.Equals("CONNECT") ) {
				/*	120,220 (success)
				 *	421 (service not available)
				*/
				switch ( l_iResponseCode ) {
					case 120 :
					case 220 :
						l_iRetval = 1;
						break;
					default:
						l_iRetval = 0;
						break;
				}
			}
			else if ( l_strCommand.Equals("USER") ) {
				/*	220,230,530,331	(success) */
				/*	332,530,500,501,530	(syntax error) */
				/*	421	(service not available) */
				switch( l_iResponseCode ) {
					case 220 : case 230 : case 331 : 
						l_iRetval = 1;
						break;
					case 332 :
						m_strError = "You don't have account for logging in";
						l_iRetval = 0;
						break;
					case 500 : 
						m_strError = "<USER> command. Syntax Error Command Unrecognized";
						l_iRetval = 0;
						break;
					case 501 :
						m_strError = "<USER> command. Syntax error in parameters or arguments";
						l_iRetval = 0;
						break;
					case 530 :
						m_strError = "User not logged on. Check your User id and password";
						l_iRetval = 0;
						break;
					default:
						m_strError = "Unknown error in USER command. Response code :" +  l_iResponseCode;
						l_iRetval = 0;
						break;
				}
			}
			else if ( l_strCommand.Equals("PASS") ) {
				/*	220,230,530,331	(success) */
				/*	332,500,501	(syntax error) */
				/*	530 not logged on */
				/*	332 not logged on */
				/*	421	(service not available) */
				switch( l_iResponseCode ) {
					case 230 : case 202 : case 331:
						l_iRetval = 1;
						break;
					case 332 :
						m_strError = "You don't have account for logging in";
						l_iRetval = 0;
						break;
					case 500 : 
						m_strError = "<PASS> command. Syntax Error Command Unrecognized";
						l_iRetval = 0;
						break;
					case 501 :
						m_strError = "<PASS> command. Syntax error in parameters or arguments";
						l_iRetval = 0;
						break;
					case 503 :
						m_strError = "<PASS> command. Bad sequence of commands";
						l_iRetval = 0;
						break;
					case 530 :
						m_strError = "User not logged on. Check your User id and password";
						l_iRetval = 0;
						break;
					default:
						m_strError = "Unknown error in PASS command. Response code :" +  l_iResponseCode;
						l_iRetval = 0;
						break;
				}
			}
			else if ( l_strCommand.Equals("SYST") ) {
				/*	215	(success) */
				/*	500,501,502 (syntax error) */
				/*	421	(service not available) */
				switch( l_iResponseCode ) {
					case 215 :
						l_iRetval = 1;
						break;
					case 500 : 
						m_strError = "<SYST> command. Syntax Error Command Unrecognized";
						l_iRetval = 0;
						break;
					case 501 :
						m_strError = "<SYST> command. Syntax error in parameters or arguments";
						l_iRetval = 0;
						break;
					case 502 :
						m_strError = "<SYST> command. Command not implemented";
						l_iRetval = 0;
						break;
					default:
						m_strError = "Unknown error in SYST command. Response code :" +  l_iResponseCode;
						l_iRetval = 0;
						break;
				}
			}
			else if ( l_strCommand.StartsWith("PWD") ) {
				/*	257	(success) */
				/*	500,501,502,550 (syntax error) */
				/*	421	(service not available) */
				switch( l_iResponseCode ) {
					case 257 :
						l_iRetval = 1;
						break;
					case 500 : 
						m_strError = "<PWD> command. Syntax Error Command Unrecognized";
						l_iRetval = 0;
						break;
					case 501 :
						m_strError = "<PWD> command. Syntax error in parameters or arguments";
						l_iRetval = 0;
						break;
					case 502 :
						m_strError = "<PWD> command. Command not implemented";
						l_iRetval = 0;
						break;
					case 550 :
						m_strError = "<PWD> command. Requested action not taken or access denied";
						l_iRetval = 0;
						break;
					default:
						m_strError = "Unknown error in PWD command. Response code :" +  l_iResponseCode;
						l_iRetval = 0;
						break;

⌨️ 快捷键说明

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