469,277 Members | 2,330 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,277 developers. It's quick & easy.

secure ftp from unix

I copied this code that works to connect into Unix. I am looking for a
way to get it to work with a secure Unix box. Anyone have any insights
on how to do this? I am trying to build an sftp service.

Thanks
Holly

Imports System
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Text.ASCIIEncoding
Imports System.Net.Sockets
Imports System.Configuration
Imports System.Resources
Public Class FTPClient
#Region "Local Properties"
'''<summary>
''' Public Property: Host - String variable.
'''</summary>
Public Property Host() As String
Get
Return _Host
End Get
Set(ByVal Value As String)
_Host = Value
End Set
End Property
'''<summary>
''' Public Property: Path - String variable.
'''</summary>
Public Property Path() As String
Get
Return _Path
End Get
Set(ByVal Value As String)
_Path = Value
End Set
End Property
'''<summary>
''' Public Property: User - String variable.
'''</summary>
Public Property User() As String
Get
Return _User
End Get
Set(ByVal Value As String)
_User = Value
End Set
End Property
'''<summary>
''' Public Property: Password - String variable.
'''</summary>
Public Property Password() As String
Get
Return _Password
End Get
Set(ByVal Value As String)
_Password = Value
End Set
End Property
'''<summary>
''' Public Property: Port - String variable.
'''</summary>
Public Property Port() As String
Get
Return _Port
End Get
Set(ByVal Value As String)
_Port = Value
End Set
End Property
'''<summary>
''' Public ReadOnly Property: ResponseCode - String variable.
'''</summary>
Public ReadOnly Property ResponseCode() As String
Get
Return _ResponseCode
End Get
End Property
'''<summary>
''' Public ReadOnly Property: ResponseData - String variable.
'''</summary>
Public ReadOnly Property ResponseData() As String
Get
Return _ResponseData
End Get
End Property
#End Region
' FTP Default Properties.
Private _Host As String = "127.0.0.1"
Private _Path As String = "."
Private _User As String = "anonymous"
Private _Password As String = "anonym...@nowhere.com"
Private _Port As Integer = 21
Private _ResponseCode As Integer
Private _ResponseData As String
Private _FTPCommandSocket As Socket = Nothing
Private _FTPLogin As Boolean = False
#Region "Public Methods"
Public Sub New()
End Sub
'''<summary>
''' Public Function: Login - This function will create a command
and data socket and then send the
''' login credentials to the FTP host.
'''</summary>
'''<returns>Function returns a Boolean.</returns>
Public Function Login() As Boolean
' Create an FTP command socket.
CreateCommandSocket()
' Send the gathered login information to the FTP host.
Try
SendCommand("USER", _User)
SendCommand("PASS", _Password)
_FTPLogin = True
Catch ex As Exception
' Login did not work because the FTP login information was
not accepted.
_ResponseData = "FTP Login function not executed."
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - FTP login information was not accepted", ex)
Return False
End Try
' Login successful.
Return True
End Function
'''<summary>
''' Public Sub: Logout - This subroutine will disconnect and close
an FTP command and data socket.
'''</summary>
'''<returns>Subroutine returns nothing.</returns>
Public Sub Logout()
' Close and destroy the FTP command socket.
If (_FTPCommandSocket Is Nothing = False) Then
SendCommand("QUIT", "")
_FTPCommandSocket.Close()
_FTPCommandSocket = Nothing
End If
End Sub
'''<summary>
''' Public Sub: SendCommand - Provided a Command and Arguements,
this subroutine will execute an FTP Command.
''' Commands already taken care of with subroutines below:
''' TYPE: Mode (ASCII or Binary)
''' NLST: List files in directory
''' SIZE: Get file Size
''' RETR: Download a file
''' STOR: Upload a file
''' DELE: Delete a file
''' RNFR: Select a file to be renamed
''' RNTO: Rename a selected file
''' PWD: Get a current directory
''' CWD: Change directory
''' RDM: Remove a directory
'''</summary>
'''<param name="FTPCommand">As String</param>
'''<param name="FTPCommandArguements">As String</param>
'''<returns>Function returns an FTP stream.</returns>
Public Sub SendCommand(ByVal FTPCommand As String, ByVal
FTPCommandArguments As String)
' Combine FTP command with the FTP command arguements.
Dim _FTPCommand As String = FTPCommand & " " &
FTPCommandArguments
_FTPCommand += Environment.NewLine
' Convert the FTP command into ASCII text.
Dim commandBytes() As Byte = ASCII.GetBytes(_FTPCommand)
Try
' Execute the FTP command on the FTP host.
_FTPCommandSocket.Send(commandBytes, commandBytes.Length,
0)
ReadResponse()
Catch ex As Exception
' Command was not executed.
_ResponseData = "FTP SendCommand subroutine not executed."
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - FTP command was not accepted", ex)
End Try
End Sub
'''<summary>
''' Public Sub: SetBinaryMode - This subroutine sets the FTP mode
to binary.
'''<param name="mode">As Boolean</param>
'''<returns>Subroutine returns nothing.</returns>
Public Sub SetBinaryMode(ByVal mode As Boolean)
If (mode) Then
'Send the FTP TYPE command as binary.
SendCommand("TYPE ", "I")
Else
'Send the FTP TYPE command as ASCII.
SendCommand("TYPE ", "A")
End If
End Sub
'''<summary>
''' Public Function: GetDirectoryFileList - This function will get
the names of the files from the provided directory name.
'''</summary>
'''<param name="directoryName">As String</param>
'''<returns>Function returns a string.</returns>
Public Function GetFileList(ByVal directoryName As String) As
String()
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
' Create an FTP data socket.
Dim _FTPDataSocket As Socket = CreateDataSocket()
'Send an FTP NLST command.
SendCommand("NLST ", directoryName)
Const _EndLine As Char = "\n"
Const _BufferSize As Integer = 512
Dim _Data As String = ""
Dim _Buffer(_BufferSize) As Byte
Dim _BytesRead As Integer = 0
If _FTPDataSocket.Connected Then
While (True)
Array.Clear(_Buffer, 0, _BufferSize)
_BytesRead = _FTPDataSocket.Receive(_Buffer,
_Buffer.Length, 0)
_Data += ASCII.GetString(_Buffer, 0, _BytesRead)
If (_BytesRead < _Buffer.Length) Then Exit While
End While
Else
_ResponseData = "FTP data socket failed to connect."
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - GetFileList subroutine failed - FTP data
socket failed to connect.", "")
End If
Dim _Parts() As String = _Data.Split(_EndLine)
' Close and destroy the FTP data socket.
If (_FTPDataSocket Is Nothing = False) Then
_FTPDataSocket.Close()
_FTPDataSocket = Nothing
End If
Return _Parts
End Function
'''<summary>
''' Public Function: GetFileSize - This function will get the size
of a provided file name.
'''</summary>
'''<param name="fileName">As String</param>
'''<returns>Function returns a Long.</returns>
' Get the size of the file on the FTP server.
Public Function GetFileSize(ByVal fileName As String) As Long
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
Dim _FileSize As Long
'Send an FTP SIZE command.
SendCommand("SIZE ", fileName)
_FileSize = 0
Return _FileSize = Int64.Parse(_ResponseData.Substring(4))
End Function
'''<summary>
''' Public Sub: DownloadFile - This subroutine gets a specific
file.
'''<param name="fileName">As String</param>
'''<param name="filePath">As String</param>
'''<optional param name="fileResume">As Boolean</param>
'''<returns>Subroutine returns nothing.</returns>
Public Sub DownloadFile(ByVal fileName As String, ByVal filePath As

String, Optional ByVal fileResume As Boolean = False)
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
' Set the FTP mode to binary.
SetBinaryMode(True)
' Create an FTP data socket.
Dim _FTPDataSocket As Socket = CreateDataSocket()
' Create a file.
Dim _FileStream As Stream
If (Not (File.Exists(filePath & fileName))) Then
_FileStream = File.Create(filePath & fileName)
_FileStream.Close()
End If
Dim _FTPFileStreamOutput As FileStream
_FTPFileStreamOutput = New FileStream(filePath & fileName,
FileMode.Open)
If fileResume Then
Dim _FileOffset As Long
_FileOffset = _FTPFileStreamOutput.Length
If (_FileOffset 0) Then
' Send an FTP REST command to restart a file.
SendCommand("REST ", _FileOffset)
If (_ResponseCode <350) Then
'The FTP host does not support resuming.
_FileOffset = 0
End If
End If
If (_FileOffset <0) Then
_FTPFileStreamOutput.Seek(_FileOffset,
SeekOrigin.Begin)
End If
End If
'Send an FTP RETR command to retrieve a file.
SendCommand("RETR ", fileName)
Const _EndLine As Char = "\n"
Const _BufferSize As Integer = 512
Dim _Data As String = ""
Dim _Buffer(_BufferSize) As Byte
Dim _BytesRead As Integer = 0
If _FTPDataSocket.Connected Then
While (True)
Array.Clear(_Buffer, 0, _BufferSize)
_BytesRead = _FTPDataSocket.Receive(_Buffer,
_Buffer.Length, 0)
_FTPFileStreamOutput.Write(_Buffer, 0, _BytesRead)
If (_BytesRead < _Buffer.Length) Then Exit While
End While
Else
_ResponseData = "FTP data socket failed to connect."
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - GetFile subroutine failed - FTP data socket
failed to connect.", "")
End If
_FTPFileStreamOutput.Close()
' Close and destroy the FTP data socket.
If (_FTPDataSocket Is Nothing = False) Then
_FTPDataSocket.Close()
_FTPDataSocket = Nothing
End If
End Sub
'''<summary>
''' Public Sub: UploadFile - This subroutine uploads a specific
file to an FTP host.
'''<param name="fileName">As String</param>
'''<param name="filePath">As String</param>
'''<optional param name="fileResume">As Boolean</param>
'''<returns>Subroutine returns nothing.</returns>
Public Sub UploadFile(ByVal fileName As String, ByVal filePath As
String, Optional ByVal fileResume As Boolean = False)
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
' Set the FTP mode to binary.
SetBinaryMode(True)
' Create an FTP data socket.
Dim _FTPDataSocket As Socket = CreateDataSocket()
' Check to see if the file exists locally before the upload.
If (File.Exists(filePath & fileName)) Then
' Open the input stream to read the source file.
Dim _FTPFileStreamInput As FileStream
_FTPFileStreamInput = New FileStream(filePath & fileName,
FileMode.Open)
If fileResume Then
' Check to see if part of the file has already been
uploaded.
Dim _FileOffset As Long
_FileOffset = 0
Try
_FileOffset = GetFileSize(fileName)
Catch ex As Exception
_FileOffset = 0
End Try
If (_FileOffset 0) Then
' Send an FTP REST command to restart a file.
SendCommand("REST ", _FileOffset)
If (_ResponseCode <350) Then
'The FTP host does not support resuming.
_FileOffset = 0
End If
End If
If (_FileOffset <0) Then
_FTPFileStreamInput.Seek(_FileOffset,
SeekOrigin.Begin)
End If
End If
' Send an FTP STOR command to store a file.
SendCommand("STOR ", fileName)
' Upload the file.
Const _BufferSize As Integer = 512
Dim _Buffer(_BufferSize) As Byte
Dim _BytesRead As Integer = 0
_BytesRead = _FTPFileStreamInput.Read(_Buffer, 0,
_Buffer.Length)
If _FTPDataSocket.Connected Then
While (_BytesRead 0)
_FTPDataSocket.Send(_Buffer, _BytesRead, 0)
_BytesRead = _FTPFileStreamInput.Read(_Buffer, 0,
_Buffer.Length)
End While
Else
_ResponseData = "FTP data socket failed to
connect."
' Throw New
MPException(AppSettings.Item("Project"), "MP.IT.Web.Library.FTP -
UploadFile subroutine failed - FTP data socket failed to connect.", "")

End If
_FTPFileStreamInput.Close()
Else
_ResponseData = "File to upload does not exist on local
machine."
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - UploadFile subroutine failed - file to upload
does not exist on local machine.", "")
End If
' Close and destroy the FTP data socket.
If (_FTPDataSocket Is Nothing = False) Then
_FTPDataSocket.Close()
_FTPDataSocket = Nothing
End If
End Sub
'''<summary>
''' Public Sub: UploadFile - This subroutine deletes a specific
file on an FTP host.
'''<param name="fileName">As String</param>
'''<returns>Subroutine returns nothing.</returns>
Public Sub DeleteFile(ByVal fileName As String)
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
' Send an FTP DELE command to delete a file.
SendCommand("DELE ", fileName)
End Sub
'''<summary>
''' Public Sub: RenameFile - This subroutine renames a specific
file on an FTP host.
'''<param name="fileName">As String</param>
'''<param name="fileNewName">As String</param>
'''<returns>Subroutine returns nothing.</returns>
Public Sub RenameFile(ByVal fileName As String, ByVal fileNewName
As String)
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
' Send an FTP RNFR command to select a file to be renamed.
SendCommand("RNFR ", fileName)
'Send an FTP RNTO command to rename the selected file to a new
file name.
SendCommand("RNTO ", fileNewName)
End Sub
'''<summary>
''' Public Sub: GetDirectory - This subroutine gets the current
directory on an FTP host.
'''<returns>Subroutine returns nothing.</returns>
Public Sub GetDirectory()
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
'Send an FTP CWD command to change to a directory.
SendCommand("PWD ", "")
End Sub
'''<summary>
''' Public Sub: ChangeDirectory - This subroutine changes to a
directory on an FTP host.
'''<param name="directoryName">As String</param>
'''<returns>Subroutine returns nothing.</returns>
Public Sub ChangeDirectory(ByVal directoryName As String)
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
'Check if in the root directory.
If (directoryName.Equals(".")) Then
Exit Sub
End If
'Send an FTP CWD command to change to a directory.
SendCommand("CWD ", directoryName)
End Sub
'''<summary>
''' Public Sub: CreateDirectory - This subroutine creates a new
directory on an FTP host.
'''<param name="directoryName">As String</param>
'''<returns>Subroutine returns nothing.</returns>
Public Sub CreateDirectory(ByVal directoryName As String)
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
'Send an FTP MKD command to make a new directory.
SendCommand("MKD ", directoryName)
End Sub
'''<summary>
''' Public Sub: RemoveDirectory - This subroutine removes a
directory on an FTP host.
'''<param name="directoryName">As String</param>
'''<returns>Subroutine returns nothing.</returns>
Public Sub RemoveDirectory(ByVal directoryName As String)
' Check to see if user is logged into FTP host.
If Not _FTPLogin Then
Login()
End If
'Send an FTP RMD command to remove a directory.
SendCommand("RMD ", directoryName)
End Sub
#End Region
#Region "Private Methods"
'''<summary>
''' Private Sub: CreateCommandSocket - Provided a Host and a port
this subroutine will instantiate an FTP command socket.
'''</summary>
'''<returns>Subroutine returns nothing.</returns>
Private Sub CreateCommandSocket()
' Create the FTP command socket.
_FTPCommandSocket = New Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp)
Try
Dim HostMachine As IPEndPoint = New
IPEndPoint(Dns.Resolve(_Host).AddressList(0), _Port)
Try
' Connect the FTP command socket to the FTP host
machine.
_FTPCommandSocket.Connect(HostMachine)
Catch ex As Exception
' Connection could not be opened due to malformed
connection.
_ResponseData = "FTP Command Socket Connection Could
Not Be Established."
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - FTP Command Socket Connection Could Not Be
Established.", ex)
End Try
Catch ex As Exception
' Connection could not be opened because DNS cannot resolve

the host IP.
_ResponseData = "FTP Command Socket Connection Could Not Be

Established. Connection could not be opened because DNS cannot resolve
the host IP."
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - FTP Command Socket Connection Could Not Be
Established. DNS cannot resolve the FTP host.", ex)
End Try
_ResponseData = "FTP Command Socket Connection Established."
ReadResponse()
End Sub
'''<summary>
''' Private Function: CreateDataSocket - Provided that a PASV
command has been sent to the host, this function returns
''' an FTP data socket.
'''</summary>
'''<returns>Subroutine returns nothing.</returns>
Private Function CreateDataSocket() As Socket
Dim _FTPDataSocket As Socket
Dim _FTPHostIPFrontBracket As Integer
Dim _FTPHostIPBackBracket As Integer
Dim _FTPHostIPData As String
Dim _FTPHostIPLength As Integer
Dim _FTPHostIPPartCount As Integer
Dim _FTPHostIPParts(6) As Integer
Dim _FTPHostIPCharater As Char
Dim _Buffer As String
Dim _Counter As Integer
'Send an FTP PASV command to use passive data connection.
SendCommand("PASV", "")
_FTPHostIPFrontBracket = _ResponseData.IndexOf("(")
_FTPHostIPBackBracket = _ResponseData.IndexOf(")")
_FTPHostIPData = _ResponseData.Substring(_FTPHostIPFrontBracket

+ 1, _FTPHostIPBackBracket - _FTPHostIPFrontBracket - 1)
_FTPHostIPLength = _FTPHostIPData.Length
_FTPHostIPPartCount = 0
_Buffer = ""
For _Counter = 0 To ((_FTPHostIPLength - 1) And
_FTPHostIPPartCount <= 6)
_FTPHostIPCharater =
Char.Parse(_FTPHostIPData.Substring(_Counter, 1))
If (Char.IsDigit(_FTPHostIPCharater)) Then
_Buffer += _FTPHostIPCharater
ElseIf (_FTPHostIPCharater <",") Then
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - FTP Host did not accept the PASV command.",
"")
End If
If ((_FTPHostIPCharater = ",") Or (_Counter + 1 =
_FTPHostIPLength)) Then
Try
_FTPHostIPParts(_FTPHostIPPartCount) =
Int32.Parse(_Buffer)
_FTPHostIPPartCount += 1
_Buffer = ""
Catch ex As Exception
' Throw New
MPException(AppSettings.Item("Project"), "MP.IT.Web.Library.FTP - FTP
Host did not accept the PASV command.", ex)
End Try
End If
Next
' Create the data host.
Dim _DataHost As String = _FTPHostIPParts(0) & "." &
_FTPHostIPParts(1) & "." & _FTPHostIPParts(2) & "." &
_FTPHostIPParts(3)
' Create the data port.
Dim _DataPort As Integer = _FTPHostIPParts(4) << 8
' Determine the data port number.
_DataPort = _DataPort + _FTPHostIPParts(5)
' Create the FTP data socket from the data host and data port.
_FTPDataSocket = New Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp)
Try
Dim HostMachine As IPEndPoint = New
IPEndPoint(Dns.Resolve(_DataHost).AddressList(0), _DataPort)
Try
' Connect the FTP data socket to the FTP host machine.
_FTPDataSocket.Connect(HostMachine)
Return _FTPDataSocket
Catch ex As Exception
' Connection could not be opened due to malformed
connection.
_ResponseData = "FTP Data Socket Connection Could Not
Be Established."
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - FTP Data Socket Connection Could Not Be
Established.", ex)
End Try
Catch ex As Exception
' Connection could not be opened because DNS cannot resolve

the host IP.
_ResponseData = "FTP Data Socket Connection Could Not Be
Established. Connection could not be opened because DNS cannot resolve
the host IP."
' Throw New MPException(AppSettings.Item("Project"),
"MP.IT.Web.Library.FTP - FTP Data Socket Connection Could Not Be
Established. DNS cannot resolve the FTP host.", ex)
End Try
_ResponseData = "FTP Data Socket Connection Established."
End Function
'''<summary>
''' Private Sub: ReadResponse - This subroutine will read line by
line the reply to
''' a command sent to an FTP host.
'''</summary>
'''<returns>Function returns a string.</returns>
Private Sub ReadResponse()
' Read the response from the FTP host.
_ResponseData = ReadLine(False)
_ResponseCode = Int32.Parse(_ResponseData.Substring(0, 3))
End Sub
'''<summary>
''' Private Function: ReadLine - This function handles the actual
reading of the FTP host reply.
'''</summary>
'''<param name="clearResponse">As Boolean</param>
'''<returns>Function returns a string.</returns>
Private Function ReadLine(ByVal clearResponse As Boolean) As String

Const _EndLine As Char = "\n"
Const _BufferSize As Integer = 512
Dim _Data As String = ""
Dim _Buffer(_BufferSize) As Byte
Dim _BytesRead As Integer = 0
If (clearResponse = True) Then _ResponseData = String.Empty
While (True)
Array.Clear(_Buffer, 0, _BufferSize)
_BytesRead = _FTPCommandSocket.Receive(_Buffer,
_Buffer.Length, 0)
_Data += ASCII.GetString(_Buffer, 0, _BytesRead)
If (_BytesRead < _Buffer.Length) Then Exit While
End While
Dim _Parts() As String = _Data.Split(_EndLine)
If (_Parts.Length 2) Then
_ResponseData = _Parts(_Parts.Length - 2)
Else
_ResponseData = _Parts(0)
End If
If (_ResponseData.Substring(3, 1).Equals(" ") = False) Then
Return ReadLine(False)
End If
Return _ResponseData
End Function
#End Region
End Class

Sep 6 '06 #1
0 1275

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by luc wastiaux | last post: by
3 posts views Thread by Marco Herrn | last post: by
reply views Thread by Lefevre, Steven | last post: by
reply views Thread by sho_nuff | last post: by
8 posts views Thread by macaronikazoo | last post: by
68 posts views Thread by Roman Ziak | last post: by
7 posts views Thread by Robert Seacord | last post: by
68 posts views Thread by Jack | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by suresh191 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.