📄 ftpclient.cs
字号:
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 + -