472,993 Members | 2,546 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,993 software developers and data experts.

Getting Error in Login() method in FtpConnection Class

I am getting an error in Login() method of the following class
FtpConnection

public class FtpConnection
{
public class FtpException : Exception
{
public FtpException(string message) : base(message){}
public FtpException(string message, Exception innerException) :
base(message,innerException){}
}

private static int BUFFER_SIZE = 512;
private static Encoding ASCII = Encoding.ASCII;

private bool verboseDebugging = false;

private string server = "localhost";
//private string server = "81.19.59.132";
private string remotePath = ".";
private string username = "anonymous";
private string password = "an*******@anonymous.net";
private string message = null;
private string result = null;

private int port = 21;
private int bytes = 0;
private int resultCode = 0;

private bool loggedin = false;
private bool binMode = false;

private Byte[] buffer = new Byte[BUFFER_SIZE];
private Socket clientSocket = null;

private int timeoutSeconds = 10;

public FtpConnection()
{

}

public FtpConnection(string server, string username, string password)
{
this.server = server;
this.username = username;
this.password = password;
}

public FtpConnection(string server, string username, string password,
int timeoutSeconds, int port)
{
this.server = server;
this.username = username;
this.password = password;
this.timeoutSeconds = timeoutSeconds;
this.port = port;
}

// Display all communications to the debug log
public bool VerboseDebugging
{
get
{
return this.verboseDebugging;
}
set
{
this.verboseDebugging = value;
}
}

// Remote server port. Typically TCP 21

public int Port
{
get
{
return this.port;
}
set
{
this.port = value;
}
}

// Timeout waiting for a response from server, in seconds.

public int Timeout
{
get
{
return this.timeoutSeconds;
}
set
{
this.timeoutSeconds = value;
}
}

// Gets and Sets the name of the FTP server.

public string Server
{
get
{
return this.server;
}
set
{
this.server = value;
}
}

// Gets and Sets the port number.

public int RemotePort
{
get
{
return this.port;
}
set
{
this.port = value;
}
}

// GetS and Sets the remote directory.

public string RemotePath
{
get
{
return this.remotePath;
}
set
{
this.remotePath = value;
}

}

// Gets and Sets the username.

public string Username
{
get
{
return this.username;
}
set
{
this.username = value;
}
}

// Gets and Set the password.

public string Password
{
get
{
return this.password;
}
set
{
this.password = value;
}
}

// If the value of mode is true, set binary mode for downloads,
else, Ascii mode.

public bool BinaryMode
{
get
{
return this.binMode;
}
set
{
if ( this.binMode == value ) return;

if ( value )
sendCommand("TYPE I");

else
sendCommand("TYPE A");

if ( this.resultCode != 200 ) throw new
FtpException(result.Substring(4));
}
}

// Login to the remote server.

public void Login()
{
if (this.loggedin) this.Close();

Debug.WriteLine("Opening connection to " + this.server, "FtpClient"
);

IPAddress addr = null;
IPEndPoint ep = null;

try
{
this.clientSocket = new Socket( AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp );
addr = Dns.Resolve(this.server).AddressList[0];
ep = new IPEndPoint( addr, this.port );
this.clientSocket.Connect(ep);
}
catch(Exception ex)
{
if ( this.clientSocket != null && this.clientSocket.Connected )
this.clientSocket.Close();

throw new FtpException("Couldn't connect to remote server",ex);
}

this.readResponse();

if(this.resultCode != 220)
{
this.Close();
throw new FtpException(this.result.Substring(4));
}

this.sendCommand( "USER " + username );

if( !(this.resultCode == 331 || this.resultCode == 230) )
{
this.cleanup();
throw new FtpException(this.result.Substring(4));
}

if( this.resultCode != 230 )
{
this.sendCommand( "PASS " + password );

if( !(this.resultCode == 230 || this.resultCode == 202) )
{
this.cleanup();
throw new FtpException(this.result.Substring(4));
}
}

this.loggedin = true;

Debug.WriteLine( "Connected to " + this.server, "FtpClient" );

this.ChangeDir(this.remotePath);
}

// Close the FTP connection.

public void Close()
{
Debug.WriteLine("Closing connection to " + this.server, "FtpClient"
);

if( this.clientSocket != null )
{
this.sendCommand("QUIT");
}

this.cleanup();
}

// Return a string array containing the remote directory's file
list.

public string[] GetFileList()
{
return this.GetFileList("*.*");
}

// Return a string array containing the remote directory's file
list.

public string[] GetFileList(string mask)
{
if ( !this.loggedin ) this.Login();

Socket cSocket = createDataSocket();

this.sendCommand("NLST " + mask);

if(!(this.resultCode == 150 || this.resultCode == 125)) throw new
FtpException(this.result.Substring(4));

this.message = "";

DateTime timeout = DateTime.Now.AddSeconds(this.timeoutSeconds);

while( timeout > DateTime.Now )
{
int bytes = cSocket.Receive(buffer, buffer.Length, 0);
this.message += ASCII.GetString(buffer, 0, bytes);

if ( bytes < this.buffer.Length ) break;
}

string[] msg = this.message.Replace("\r","").Split('\n');

cSocket.Close();

if ( this.message.IndexOf( "No such file or directory" ) != -1 )
msg = new string[]{};

this.readResponse();

if ( this.resultCode != 226 )
msg = new string[]{};
// throw new FtpException(result.Substring(4));
return msg;
}

// Return the size of a file.

public long GetFileSize(string fileName)
{
if ( !this.loggedin ) this.Login();

this.sendCommand("SIZE " + fileName);
long size=0;

if ( this.resultCode == 213 )
size = long.Parse(this.result.Substring(4));

else
throw new FtpException(this.result.Substring(4));

return size;
}

// Download a file to the Assembly's local directory,
// keeping the same file name.

public void Download(string remFileName)
{
this.Download(remFileName,"",false);
}

// Download a remote file to the Assembly's local directory,
// keeping the same file name, and set the resume flag.

public void Download(string remFileName,Boolean resume)
{
this.Download(remFileName,"",resume);
}

// Download a remote file to a local file name which can include
// a path. The local file name will be created or overwritten,
// but the path must exist.

public void Download(string remFileName,string locFileName)
{
this.Download(remFileName,locFileName,false);
}

// Download a remote file to a local file name which can include
// a path, and set the resume flag. The local file name will be
// created or overwritten, but the path must exist.

public void Download(string remFileName,string locFileName,Boolean
resume)
{
if ( !this.loggedin ) this.Login();

this.BinaryMode = true;

Debug.WriteLine("Downloading file " + remFileName + " from " +
server + "/" + remotePath, "FtpClient" );

if (locFileName.Equals(""))
{
locFileName = remFileName;
}

FileStream output = null;

if ( !File.Exists(locFileName) )
output = File.Create(locFileName);

else
output = new FileStream(locFileName,FileMode.Open);

Socket cSocket = createDataSocket();

long offset = 0;

if ( resume )
{
offset = output.Length;

if ( offset > 0 )
{
this.sendCommand( "REST " + offset );
if ( this.resultCode != 350 )
{
//Server dosnt support resuming
offset = 0;
Debug.WriteLine("Resuming not supported:" + result.Substring(4),
"FtpClient" );
}
else
{
Debug.WriteLine("Resuming at offset " + offset, "FtpClient" );
output.Seek( offset, SeekOrigin.Begin );
}
}
}

this.sendCommand("RETR " + remFileName);

if ( this.resultCode != 150 && this.resultCode != 125 )
{
throw new FtpException(this.result.Substring(4));
}

DateTime timeout = DateTime.Now.AddSeconds(this.timeoutSeconds);

while ( timeout > DateTime.Now )
{
this.bytes = cSocket.Receive(buffer, buffer.Length, 0);
output.Write(this.buffer,0,this.bytes);

if ( this.bytes <= 0)
{
break;
}
}

output.Close();

if ( cSocket.Connected ) cSocket.Close();

this.readResponse();

if( this.resultCode != 226 && this.resultCode != 250 )
throw new FtpException(this.result.Substring(4));
}

// Upload a file.

public void Upload(string fileName)
{
this.Upload(fileName,false);
}

// Upload a file and set the resume flag.

public void Upload(string fileName, bool resume)
{
if ( !this.loggedin ) this.Login();

Socket cSocket = null ;
long offset = 0;

if ( resume )
{
try
{
this.BinaryMode = true;

offset = GetFileSize( Path.GetFileName(fileName) );
}
catch(Exception)
{
// file not exist
offset = 0;
}
}

// open stream to read file
FileStream input = new FileStream(fileName,FileMode.Open);

if ( resume && input.Length < offset )
{
// different file size
Debug.WriteLine("Overwriting " + fileName, "FtpClient");
offset = 0;
}
else if ( resume && input.Length == offset )
{
// file done
input.Close();
Debug.WriteLine("Skipping completed " + fileName + " - turn resume
off to not detect.", "FtpClient");
return;
}

// dont create untill we know that we need it
cSocket = this.createDataSocket();

if ( offset > 0 )
{
this.sendCommand( "REST " + offset );
if ( this.resultCode != 350 )
{
Debug.WriteLine("Resuming not supported", "FtpClient");
offset = 0;
}
}

this.sendCommand( "STOR " + Path.GetFileName(fileName) );

if ( this.resultCode != 125 && this.resultCode != 150 ) throw new
FtpException(result.Substring(4));

if ( offset != 0 )
{
Debug.WriteLine("Resuming at offset " + offset, "FtpClient" );

input.Seek(offset,SeekOrigin.Begin);
}

Debug.WriteLine( "Uploading file " + fileName + " to " + remotePath,
"FtpClient" );

while ((bytes = input.Read(buffer,0,buffer.Length)) > 0)
{
cSocket.Send(buffer, bytes, 0);
}

input.Close();

if (cSocket.Connected)
{
cSocket.Close();
}

this.readResponse();

if( this.resultCode != 226 && this.resultCode != 250 ) throw new
FtpException(this.result.Substring(4));
}

// Upload a directory and its file contents

public void UploadDirectory(string path, bool recurse)
{
this.UploadDirectory(path,recurse,"*.*");
}

// Upload a directory and its file contents

public void UploadDirectory(string path, bool recurse, string mask)
{
string[] dirs = path.Replace("/",@"\").Split('\\');
string rootDir = dirs[ dirs.Length - 1 ];

// make the root dir if it doed not exist
if ( this.GetFileList(rootDir).Length < 1 ) this.MakeDir(rootDir);

this.ChangeDir(rootDir);

foreach ( string file in Directory.GetFiles(path,mask) )
{
this.Upload(file,true);
}
if ( recurse )
{
foreach ( string directory in Directory.GetDirectories(path) )
{
this.UploadDirectory(directory,recurse,mask);
}
}

this.ChangeDir("..");
}

// Delete a file from the remote FTP server.

public void DeleteFile(string fileName)
{
if ( !this.loggedin ) this.Login();

this.sendCommand( "DELE " + fileName );

if ( this.resultCode != 250 ) throw new
FtpException(this.result.Substring(4));

Debug.WriteLine( "Deleted file " + fileName, "FtpClient" );
}

// Rename a file on the remote FTP server.

public void RenameFile(string oldFileName,string newFileName, bool
overwrite)
{
if ( !this.loggedin ) this.Login();

this.sendCommand( "RNFR " + oldFileName );

if ( this.resultCode != 350 ) throw new
FtpException(this.result.Substring(4));

if ( !overwrite && this.GetFileList(newFileName).Length > 0 ) throw
new FtpException("File already exists");

this.sendCommand( "RNTO " + newFileName );

if ( this.resultCode != 250 ) throw new
FtpException(this.result.Substring(4));

Debug.WriteLine( "Renamed file " + oldFileName + " to " +
newFileName, "FtpClient" );
}

// Create a directory on the remote FTP server.

public void MakeDir(string dirName)
{
if ( !this.loggedin ) this.Login();

this.sendCommand( "MKD " + dirName );

if ( this.resultCode != 250 && this.resultCode != 257 ) throw new
FtpException(this.result.Substring(4));

Debug.WriteLine( "Created directory " + dirName, "FtpClient" );
}

// Delete a directory on the remote FTP server.

public void RemoveDir(string dirName)
{
if ( !this.loggedin ) this.Login();

this.sendCommand( "RMD " + dirName );

if ( this.resultCode != 250 ) throw new
FtpException(this.result.Substring(4));

Debug.WriteLine( "Removed directory " + dirName, "FtpClient" );
}

// Change the current working directory on the remote FTP server.

public void ChangeDir(string dirName)
{
if( dirName == null || dirName.Equals(".") || dirName.Length == 0 )
{
return;
}

if ( !this.loggedin ) this.Login();

this.sendCommand( "CWD " + dirName );

if ( this.resultCode != 250 ) throw new
FtpException(result.Substring(4));

this.sendCommand( "PWD" );

if ( this.resultCode != 257 ) throw new
FtpException(result.Substring(4));

// gonna have to do better than this....
this.remotePath = this.message.Split('"')[1];

Debug.WriteLine( "Current directory is " + this.remotePath,
"FtpClient" );
}

private void readResponse()
{
this.message = "";
this.result = this.readLine();

if ( this.result.Length > 3 )
this.resultCode = int.Parse( this.result.Substring(0,3) );
else
this.result = null;
}

private string readLine()
{
while(true)
{
this.bytes = clientSocket.Receive( this.buffer, this.buffer.Length,
0 );
this.message += ASCII.GetString( this.buffer, 0, this.bytes );

if ( this.bytes < this.buffer.Length )
{
break;
}
}

string[] msg = this.message.Split('\n');

if ( this.message.Length > 2 )
this.message = msg[ msg.Length - 2 ];

else
this.message = msg[0];
if ( this.message.Length > 4 &&
!this.message.Substring(3,1).Equals(" ") ) return this.readLine();

if ( this.verboseDebugging )
{
for(int i = 0; i < msg.Length - 1; i++)
{
Debug.Write( msg[i], "FtpClient" );
}
}

return message;
}

private void sendCommand(String command)
{
if ( this.verboseDebugging ) Debug.WriteLine(command,"FtpClient");

Byte[] cmdBytes = Encoding.ASCII.GetBytes( ( command + "\r\n"
).ToCharArray() );
clientSocket.Send( cmdBytes, cmdBytes.Length, 0);
this.readResponse();
}

// when doing data transfers, we need to open another socket for
it.

private Socket createDataSocket()
{
this.sendCommand("PASV");

if ( this.resultCode != 227 ) throw new
FtpException(this.result.Substring(4));

int index1 = this.result.IndexOf('(');
int index2 = this.result.IndexOf(')');

string ipData = this.result.Substring(index1+1,index2-index1-1);

int[] parts = new int[6];

int len = ipData.Length;
int partCount = 0;
string buf="";

for (int i = 0; i < len && partCount <= 6; i++)
{
char ch = char.Parse( ipData.Substring(i,1) );

if ( char.IsDigit(ch) )
buf+=ch;

else if (ch != ',')
throw new FtpException("Malformed PASV result: " + result);

if ( ch == ',' || i+1 == len )
{
try
{
parts[partCount++] = int.Parse(buf);
buf = "";
}
catch (Exception ex)
{
throw new FtpException("Malformed PASV result (not supported?): "
+ this.result, ex);
}
}
}

string ipAddress = parts[0] + "."+ parts[1]+ "." + parts[2] + "." +
parts[3];

int port = (parts[4] << 8) + parts[5];

Socket socket = null;
IPEndPoint ep = null;

try
{
socket = new
Socket(AddressFamily.InterNetwork,SocketType.Strea m,ProtocolType.Tcp);
ep = new IPEndPoint(Dns.Resolve(ipAddress).AddressList[0], port);
socket.Connect(ep);
}
catch(Exception ex)
{
// doubtfull....
if ( socket != null && socket.Connected ) socket.Close();

throw new FtpException("Can't connect to remote server", ex);
}

return socket;
}

// Always release those sockets.
private void cleanup()
{
if ( this.clientSocket!=null )
{
this.clientSocket.Close();
this.clientSocket = null;
}
this.loggedin = false;
}

// Destuctor

~FtpConnection()
{
this.cleanup();
}
Here I am calling this class through
FtpConnection ftp = new
FtpConnection("servername","username","password");
ftp.Login();
ftp.Upload(@filename);
But it gives the error Error System.NullReferenceException: Object
reference not set to an instance of an object.

Please help me here.........

Feb 1 '06 #1
0 3635

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

11
by: suzy | last post by:
i am trying to write aspx login system and the login process requires a validity check of username and password. i have been told that raising exception is costly, but i want a custom error...
4
by: Larry Tate | last post by:
I am wanting to get those cool html error pages that ms produces when I hit an error in asp.net. For instance, when I get a compilation error I get an html error page that shows me the ...
7
by: Joe Rigley | last post by:
Hi, I have a custom class with a public method. I want to perform a repose.redirect if an error occurs in the public method GetUserRoles. Unfortunately, Visual Studio 2003 is throwing an error...
5
by: olaamussah | last post by:
Hi, i just started learning perl which i would use for my uni. project unfortunately. Well, this is a simple user login page i tried to create but i cant get it to work. Can someone please check this...
0
by: malvagia | last post by:
I currently have a login page for a web app that raises a Twisted UnauthorizedLogin Error if the username or password is wrong. I am trying to add to this a check to see if the account is enabled...
4
by: preeti13 | last post by:
Hi friends i have a probelm i am try to pass the value to the employeeid parameter but getting th error please help me how i can do this i am getting the error here is my code using System;...
2
by: preeti13 | last post by:
Hi guys i am here with my another probelm please help me.trying insert the value into the data base but getting the null value error .I am getting thsi error Cannot insert the value NULL into...
0
by: buntyindia | last post by:
Hi, I have a very strange problem with my application. I have developed it using Struts. I have a TextBox With Some fixed value in it and on Submit iam passing it to another page. <html:form...
21
vikas251074
by: vikas251074 | last post by:
I am getting error while entry in userid field. When user enter his user id, an event is fired immediately and user id is verified using AJAX method. But I am getting error 'Object doesn't support...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 4 Oct 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
tracyyun
by: tracyyun | last post by:
Hello everyone, I have a question and would like some advice on network connectivity. I have one computer connected to my router via WiFi, but I have two other computers that I want to be able to...
4
NeoPa
by: NeoPa | last post by:
Hello everyone. I find myself stuck trying to find the VBA way to get Access to create a PDF of the currently-selected (and open) object (Form or Report). I know it can be done by selecting :...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 1 Nov 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM) Please note that the UK and Europe revert to winter time on...
3
by: nia12 | last post by:
Hi there, I am very new to Access so apologies if any of this is obvious/not clear. I am creating a data collection tool for health care employees to complete. It consists of a number of...
0
NeoPa
by: NeoPa | last post by:
Introduction For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
0
isladogs
by: isladogs | last post by:
The next online meeting of the Access Europe User Group will be on Wednesday 6 Dec 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, Mike...
4
by: GKJR | last post by:
Does anyone have a recommendation to build a standalone application to replace an Access database? I have my bookkeeping software I developed in Access that I would like to make available to other...
3
SueHopson
by: SueHopson | last post by:
Hi All, I'm trying to create a single code (run off a button that calls the Private Sub) for our parts list report that will allow the user to filter by either/both PartVendor and PartType. On...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.