473,480 Members | 1,890 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

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 3690

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

Similar topics

11
4812
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
1793
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
2197
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
5721
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
975
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
2086
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
2404
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
2895
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
3791
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...
0
7041
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
6908
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7043
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
7081
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
1
4776
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
2984
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
1300
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
1
563
muto222
php
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
179
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

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.