Desenvolvimento - Visual Basic

VB: Protocolo FTP e Winsock

Este artigo explica o básico sobre o protocolo FTP, e num futuro artigo, será explicado como usá-lo, no Visual Basic, através do controle Microsoft Winsock Control.

por Davi Medrade



Estou escrevendo este artigo porque já vi vários amigos meus que precisaram usar FTP no Visual Basic recorrerem a OCX externas e acabarem tendo problemas. Aqui, vou explicar o básico sobre o protocolo FTP, e num futuro artigo, explicarei como usá-lo, no Visual Basic, através do controle Microsoft Winsock Control.

Parte 1 - O FTP

O FTP (File Transfer Protocol) é um protocolo criado para facilitar a transferência de arquivos entre clientes e servidores. Às vezes, é necessário usar FTP até para programar modems ADSL (o modem é o servidor, e por FTP é enviado um arquivo de configurações).

1.1 - As conexões

O FTP usa dois tipos de conexão: a conexão de controle e a conexão de dados. A conexão de controle é sempre efetuada na porta 21, e é através dela que enviamos comandos ao servidor e recebemos mensagens de status. A conexão de dados é feita em uma porta estipulada pelo cliente (através do comando PORT) ou pelo servidor (em resposta a um comando PASV emitido pelo cliente), e é através dela que se se envia e recebe dados, tais como o conteúdo dos arquivos, ou uma lista de arquivos na pasta atual.

1.2 - Os comandos

O FTP se baseia no envio de comandos, os quais sempre geram uma resposta por parte do servidor. Para enviar um comando, basta enviar o texto do comando pela conexão de controle, seguido de um Line Feed (ASCII 10 - 0x0A). Após o envio do comando, o servidor efetuará as ações correspondentes a ele, e dará uma resposta de acordo com a situação. O texto da resposta é apenas para um usuário humano, e pode variar de servidor para servidor. Para processamento, deve-se usar o código de retorno. A resposta do servidor possui sempre o seguinte formato:

Listagem 1: Formato da resposta do servidor

220<Espaço>Resposta do Servidor<LineFeed>

Onde 220 é o código de retorno. Em seguida vem um espaço em branco (ASCII 32 - 0x20) e o texto da resposta, seguido por um Line Feed (ASCII 10 - 0x0A). Caso a resposta ocupe mais de uma linha, a resposta vem no seguinte formato:

Listagem 2: Formato de resposta com mais de uma linha

220-<Espaço>Resposta (Linha 1)<LineFeed>
220-<Espaço>Resposta (Linha 2)<LineFeed>
<Linhas intermediárias seguindo o mesmo formato da primeira>
220<Espaço>Resposta (Última Linha)<LineFeed>

Neste formato, todas as linhas, com exceção da última, possuem um hífen (ASCII 45 - 0x2D) imediatamente após o código de retorno, exceto a última, que não possui hífen justamente para sinalizar que é a última linha da resposta.

Portanto, quando for enviado um comando e o código de retorno da resposta for seguido de um hífen, deve-se continuar aguardando dados do servidor até que venha uma linha cujo código não tenha hífen.

1.3 Principais comandos

Os principais comandos do FTP são:

USER - Determina o nome de usuário com o qual deve-se logar no servidor. Para login anônimo, deve-se usar o nome de usuário "anonymous". Exemplos:

  • USER MyUserName
  • USER anonymous

Este comando normalmente gera uma resposta "331 Password reequired for MyUserName.", indicando que deve-se enviar um comando PASS, de modo a completar o login.

PASS - Informa a senha que deve ser usada no login. Para login anônimo, é o endereço de e-mail do usuário, mas normalemnte usa-se "a@a.com". Exemplos:

  • Cliente -> USER davi
  • Servidor -> 331 Password required for davi.
  • Cliente -> PASS senha
  • Servidor -> 230 Login successful.

CWD - Muda a pasta atual no servidor (Change Working Directory). Exemplo:

  • Cliente -> CWD /etc/conf/
  • Servidor -> 250 CWD command successful.

PWD - Exibe a pasta atual no servidor (Print Working Directory). Exemplo:

  • Cliente -> PWD
  • Servidor -> 257 "/etc/conf" is current directory.

CDUP - Equivale a "CWD ..". Sobe um nível na árvore de diretórios. Exemplo:

  • Cliente -> PWD
  • Servidor -> 257 "/etc/conf" is current directory.
  • Cliente -> CDUP
  • Servidor -> 250 CDUP command successful.
  • Cliente -> PWD
  • Servidor -> 257 "/etc" is current directory.

SYST - Retorna o tipo de sistema operacional no servidor (System Type).

  • Cliente -> SYST
  • Servidor -> 215 UNIX Type: L8

1.4 - Usando a conexão de dados

A conexão de dados é usada para enviar ou receber dados do servidor. Esta conexão é criada, os dados são transferidos, e em seguida a conexão é fechada, indicando o fim da transmissão de dados. Para poder usar a conexão, deve-se definir a porta em que será feita a conexão. Esta definição pode ser feita através do comando PORT:

PORT - Informa ao servidor a porta em que será feita a próxima conexão de dados.

  • Cliente -> PORT 192,168,0,113,6,255
  • Servidor -> 200 PORT command successful.

Neste comando, deve-se passar 6 valores separados pro vírgula. Os 4 primeiros são os dígitos do IP, que no exemplo é 192.168.0.113. Os outros dois valores representam a porta TCP em que será feita a conexão. Para calcular esses dígitos, suponhamos que a porta será 0x1234. Basta separar os dois bytes que compõem este valor e convertê-los para decimal: 0x12, 0x34, ou seja, 18 e 52, portanto, o nosso PORT seria: "PORT 192,168,0,113,18,52" . Depois de enviar este comando, deve-se enviar um comando que necessite de uma conexão de dados, e preparar uma conexão para ficar "escutando" na porta indicada, até que o servidor se conecte a ela. No comando PORT deve-se especificar uma porta que não esteja sendo utilizada, do contrário não será possível "escutar" nela, aguardando a conexão do servidor. Se você preferir que o servidor especifique a porta, use o comando PASV:

PASV - Retorna a porta na qual deve ser feita a próxima conexão de dados. Exemplo:

  • Cliente -> PASV
  • Servidor -> 227 Entering Passive Mode (192,168,0,1,10,45)

Os bytes retornados nos parênteses são: os quatro primeiros são o IP, os outros dois são a porta. Para obter o número da porta, pegue o primeiro valor, multiplique por 256 e some ao segundo. Neste caso (10,45) a porta seria 2605 (10*256 + 45). Depois de enviar este comando, deve-se enviar um comando que necessite de uma conexão de dados, tal como LIST, ou STOR, e em seguida, criar a conexão de dados na porta especificada.

Lembre-se que a única forma de sinalizar o final do envio de dados pela conexão de dados é fechando-a.

1.5 - Comandos que usam a conexão de dados

Abaixo vão alguns dos comandos que precisam que seja estabelecida uma conexão de dados.

LIST - Retorna a lista de arquivos na pasta atual no servidor. Deve ser precedido de um PASV ou PORT. A lista é enviada pela conexão de dados. Exemplo:

  • Cliente -> PASV
  • Servidor -> 227 Entering Passive Mode (200,206,10,1,16,16)
  • Cliente -> LIST
  • Cliente ->
  • Servidor -> 150 Opening ASCII mode data connection for file list
  • Servidor ->
  • Servidor ->
  • Servidor -> 226 Transfer complete

STOR - Envia um arquivo para o servidor. Exemplo:

  • Cliente -> PASV
  • Servidor -> 227 Entering Passive Mode (200,206,10,1,16,16)
  • Cliente -> STOR myfile.txt
  • Cliente ->
  • Servidor -> 150 Opening ASCII mode data connection for myfile.txt
  • Cliente ->
  • Cliente ->
  • Servidor -> 226 Transfer complete.

RETR - Faz o download de um arquivo do servidor. Exemplo:

  • Cliente -> PASV
  • Servidor -> 227 Entering Passive Mode (200,206,10,1,16,16)
  • Cliente -> RETR myfile.txt
  • Cliente ->
  • Servidor -> 150 Opening ASCII mode data connection for myfile.txt (1567 bytes)
  • Servidor ->
  • Servidor ->
  • Servidor -> 226 Transfer complete.

Este é o básico sobre o protocolo FTP. No próximo artigo, veremos a implementação de um client FTP em Visual Basic, usando o Winsock.

Davi Medrade

Programador VB, C++ e PHP

Davi Medrade

Davi Medrade - Programador VB, C++ e PHP