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