VB6 - Winsock : simulando o Telnet


Neste artigo voltamos a falar do controle winsock . Lembra dele ? Para clarear um pouco a sua lembrança reveja os links para os artigos do site :

O propósito deste artigo é mostrar mais uma utilização do controle Winsock : vamos criar um servidor Telnet . Você sabe o que é telnet ?

O que é Telnet ?

"Telnet é o recurso da INTERNET que permite estabelecer uma conexão com outro computador da rede. Ele oferece a oportunidade de estar em um sistema computacional e trabalhar em outro, não importando se o sistema está localizado na sala ao lado, em um prédio próximo, na mesma cidade, ou a milhares de quilômetros de distância.

Você acessa um outro computador como se o seu terminal (microcomputador PC, estação de trabalho, etc.) estivesse ligado diretamente àquele computador. A única diferença é que, se este outro computador estiver distante, a resposta aos seus comandos pode ser um pouco mais lenta, ou seja, os caracteres digitados levam um pouco mais de tempo para aparecer na tela (em torno de um segundo ou mais).

Para utilizar o Telnet, em primeiro lugar você deverá saber o nome do computador ou Host que deseja acessar. Normalmente, esta máquina solicitará a identificação do usuário e também uma senha. A identificação do usuário, também chamada de conta, user-id, username, login, serve para que o computador que está sendo acessado identifique se você é um usuário autorizado a utilizá-lo. Já a senha, também chamada de password, prova que é realmente você que está solicitando acesso. Este processo é semelhante ao que você realiza quando utiliza um caixa eletrônico de banco."

Diversas organizações oferecem uma série de serviços públicos que, ou não necessitam de senha, ou a senha é pública.

Vamos a um exemplo: Vamos acessar o banco de dados em csi.carl.org.

Estando no Windows 95/98 clique em - Iniciar - depois em -Executar - e na caixa Executar no prompt - Abrir - digite :

telnet nome_da_máquina_a_ser_acessada ou número IP da máquina a ser acessada

O nome_da_máquina_ai_ser_acessada pode ser tanto no formato alfanumérico (csi.carl.org) quanto no formato numérico (192.54.81.18), também chamado de endereço IP. (Veja abaixo)

- Voce pode digitar somente - Telnet e estando no aplicativo Telnet , clicar em Conectar - Sistema Remoto e a seguir informe o endereço em : Nome do host:

Exemplo: telnet csi.carl.org ou telnet 192.54.81.18. Você vai obter a tela como abaixo:

Se digitar PAC o resultado será o seguinte :

Bom , acho que deu para você ter uma noção sobre telnet. Agora vamos voltar ao artigo.

Como eu estava escrevendo , vou criar um servidor telnet usando Winsock. Vai ser um servidor simples mas com a funcionalidade de se comunicar com o Telnet. Vamos lá...

O servidor Telnet

Nosso servidor Telnet usará o controle Winsock para se comunicar e irá escutar a porta 23 , que é a porta padrão do Telnet ; nesta porta ele irá escutar as requisições dos usuários e enviar as respostas a estas requisições.

Sua funcionalidade será bem simples , resolverá somente os seguintes comandos :

Dir - obtem lista de diretorios
Exit - efetua logout do servidor
time - obtem a hora do servidor
help - exibe lista de comandos suportada pelo servidor.

1- Inicie um novo projeto no Visual Basic e no formulário padrão inclua o controle - Microsoft Winsock Control - Veja abaixo o formulário em tempo de desenho. (Alteramos a cor de fundo do formulário para preto.)

2- Na seção - General Declarations - vamos definir as variáveis visíveis em todo o formulário e a API - Sleep - usada para dar uma pausa durante a execução.

Option Explicit

'usada para dar uma pausa no programa
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'variáveis usadas no projeto
Dim UsuarioID As String
Dim Senha As String
Dim IDAceito As Boolean
Dim LoginOK As Boolean
Dim ComandoUsuario As String

3- No evento Load do formulário vamos definir a porta que o servidor vai 'escutar' e limpar o conteúdo das variáveis.

Private Sub Form_Load()
Winsock1.LocalPort = 23 'define a porta do telnet
Winsock1.Listen 'configura o servidor para ouvir uma requisição do cliente

UsuarioID = ""
Senha = ""
ComandoUsuario = ""
IDAceito = False
LoginOK = False

End Sub

4- No evento - ConnectionRequest - verificamos o estado da conexao , e se houver uma requisição do usuário para efetuar o Logon enviamos a mensagem para que o mesmo informa seu Login.

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)

'Usuario quer se conectar no servidor
If Winsock1.State <> sckClosed Then Winsock1.Close
Winsock1.Accept requestID
'envia mensagem de aceitacao e pergunta se quer se logar
Winsock1.SendData "Informe o seu Login para Servidor Demo: "

End Sub

5- No evento - DataArriVal- é feito todo o serviço de tratamento dos dados que chegam ao servidor.

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim entrada As String
Dim MeuNome As String
Dim DirList() As String
Dim DirPonteiro As Integer
Dimindice As Integer

'usuario envia alguma informacao
Winsock1.GetData entrada 'recebe a entrada do cliente
If LoginOK Then 'verifica se o usuario ja esta logado
   If Asc(entrada) = 13 Then
     If ComandoUsuario Like "dir*[\]" Then 'procesa o comando dir
       Winsock1.SendData vbCrLf
       ComandoUsuario = Mid$(ComandoUsuario, 4, Len(ComandoUsuario) - 3)
       DirPonteiro = 1
       ComandoUsuario = Trim(ComandoUsuario)
       'obtem lista do diretorio atual
       MeuNome = Dir(ComandoUsuario, vbDirectory)
       Do While MeuNome <> ""
         If MeuNome <> "." And MeuNome <> ".." Then
           If (GetAttr(ComandoUsuario & MeuNome) And vbDirectory) = vbDirectory Then
             ReDim Preserve DirList(1 To DirPonteiro)
             DirList(DirPonteiro) = MeuNome
             DirPonteiro = DirPonteiro + 1
          End If ' representa um diretorio.
        End If
        MeuNome = Dir ' obtem proxima entrada
       Loop
       Forindice = 1 To DirPonteiro - 1
         Winsock1.SendData DirList(ii) & vbCrLf
       Next
       Winsock1.SendData "Sanjeev>" 'Exibe o prompt >
       ComandoUsuario = ""
     ElseIf Trim(ComandoUsuario) Like "exit" Then
     'usuario quer terminar a sessao
     Winsock1_close
     ComandoUsuario = ""
   ElseIf Trim(ComandoUsuario) Like "help" Then
   'Usuario requisita pelo conjunto de comando suportado pelo servidor
   Winsock1.SendData vbCrLf & "Lista de comandos suportados pelo servidor Demo" & vbCrLf
   Winsock1.SendData "Dir --- obtem lista de diretorios." & vbCrLf
   Winsock1.SendData "exit --- efetua logout do servidor." & vbCrLf
   Winsock1.SendData "time --- obtem a hora do servidor." & vbCrLf
   Winsock1.SendData "help --- exibe lista de comandos suportada pelo servidor." & vbCrLf
   Winsock1.SendData "Demo>"
   ComandoUsuario = ""
 ElseIf Trim(ComandoUsuario) Like "time" Then
  'envia a hora do servidor
  Winsock1.SendData vbCrLf & Time & vbCrLf
  Winsock1.SendData "Demo>"
  ComandoUsuario = ""
 Else
  'comando invalido ou nao suportado pelo servidor Telnet
  Winsock1.SendData vbCrLf & "Comando Invalido" & vbCrLf _ 
  & "Para exibir lista de comandos use o comando : help " & vbCrLf
  ComandoUsuario = ""
  Winsock1.SendData "Demo>"
 End If
Else
 Winsock1.SendData entrada
 ComandoUsuario = ComandoUsuario & entrada
End If
Else
 'Obtem autenticacao do usuario
If IDAceito And Asc(entrada) = 13 Then
 Winsock1.SendData vbCrLf & "Verificando sua informação de login...." & vbCrLf

If UsuarioID = "Teste" And Senha = "jcm" Then
 Sleep (2000)
 Winsock1.SendData "Benvindo ao servidor telnet Demo!!!" & vbCrLf & "Demo>"
 LoginOK = True
Else
 IDAceito = False
 UsuarioID = ""
 Senha = ""
 Winsock1.SendData "Informe seu Login : "
 Exit Sub
End If
ElseIf Asc(entrada) = 13 Then
 Winsock1.SendData entrada & vbCrLf & "Informe a Senha:"
 IDAceito = True
 Exit Sub
ElseIf Not IDAceito Then
 Winsock1.SendData entrada
End If
 If IDAceito Then
 Senha = Senha & entrada
Else
 UsuarioID = UsuarioID & entrada
End If
End If
End Sub

Pronto ! Você acabou de ver o código do nosso servidor que será chamado de - Demo. Vamos ver se funciona ?

Testando o Servidor Telnet

Para realizar a conexão definimos a senha como : Teste e a senha como : jcm.

Vamos realizar o teste na máquina local , se funcionar na máquina local funcionará também em máquinas remotas. Rode o projeto , você não vai ver nada de mais ; somente a tela como abaixo: (poderiamos minimizar a execução do projeto)

Estando no Windows 95/98 clique em - Iniciar - depois em -Executar - e na caixa Executar no prompt - Abrir - digite : Telnet 127.0.0.1.( 127.0.0.1 é o número IP da sua máquina local.)

O servidor vai 'escutar' a requisição e irá responder conforme a tela abaixo:

Você deverá informar o Login : Teste e a Senha: jcm . Nosso servidor irá verificar se a informação esta correta e irá responder :

Agora você pode testar os demais comandos suportados pelo nosso servidor : dir , help , time e exit. (Veja abaixo. )

Você verá que funciona , ou seja , o seu programa VB que esta rodando em segundo plano , e utiliza o controle winsock , recebe e envia requisições na porta 23 . O cliente usado neste artigo é o próprio programa Telnet. Gostou ???

Até a próxima ...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti