Per un progetto di cui mi sono occupato in azienda ho avuto la necessità di interfacciare la mia applicazione con un dispositivo elettronico, il quale comunica con l'esterno tramite un server FTP.

Com'è noto il protocollo comuica con la porta 21 e la prima operazione da compiere è l'autenticazione.


Private tpTcpClient As TcpClient
 ftpTcpClient = New TcpClient(strftpLogin, 21)

A questo punto dobbiamo inviare dei comandi con i quali comunichiamo le nostre credenziali di accesso :

ResponseStream = ftpTcpClient.GetStream
strCommand =
"USER " + strName + vbCrLf
bteSendBytes = Encoding.ASCII.GetBytes(strCommand)
ResponseStream.Write(bteSendBytes, 0, bteSendBytes.Length)

Per permettere al server FTP di darci una risposta al comando dobbiamo attedere una frazione di secondo prima dell'invio della password

 

Threading.Thread.Sleep(500)


Ripetiamo le operazioni per la Password

 

strCommand = "PASS " + strPWD + vbCrLf
Array.Clear(bteSendBytes, 0, bteSendBytes.Length)
bteSendBytes = Encoding.ASCII.GetBytes(strCommand)
ResponseStream.Write(bteSendBytes, 0, bteSendBytes.Length)


A questo punto se tutto è andato a buon fine dovremmo essere connessi al dispositivo che rimane in attesa di un nostro comando.

Il protocollo FTP ha due metodi comunicazione attivo e passivo.

La differenza fondamentale è che nel caso di comunicazione passiva è il server a comunicare al client attraverso il comando PASV la porta di comunicazione nel quale verrà instaruata la comunicazione, mentre nel caso di ftp attivo è il client ad indicare al server attraverso il comando PORT la porta di comunicazione che rimane in ascolto in attesa di una connessione da parte del server FTP.

Tipicamente le porte di comunicazione devono essere  > 1023.

Il disposito lavora con un FTP di tipo attivo quindi sarà nostro compito indircargli a quale porta attendiamo la comunicazione :


 

Dim ipLocale As String = Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString()
Dim Listener As New TcpListener(IPAddress.Parse(ipLocale), myPortOpen)
Listener.Start()


Inviamo i comandi per richiedere il file desiderato :

 

FTPCommands(ftpStream, "TYPE I", returnMessage)
FTPCommands(ftpStream,
"PORT 192,168,0,3,7,35", returnMessage)
FTPCommands(ftpStream,
"RETR " + strFilePath, returnMessage)

A questo punto non ci resta che attendere che il server faccia la sua richiesta di comunicazione alla porta indicata

If  Listener.Pending Then

dataClient = Listener.AcceptTcpClient()
DownloadStream = dataClient.GetStream
ReDim
bytDwFile(1024)Do
lngFileLength = DownloadStream.Read(bytDwFile, 0, 1024)
DwFile.Write(bytDwFile, 0, lngFileLength)
Loop While
lngFileLength > 0


Listener.Stop()

A questo punto abbiamo concluso le operazioni di download non ci resta che salvare il file sul nostro pc.