Olá leitores iMasters! Após dez dias de férias estamos de volta com nossa coluna. Neste artigo veremos como conectar diversos usuários, dicas de como utilizar melhor esta OCX, formas de conexão, múltiplos clientes, portas e muitos outros recursos.
Conexão pelo protocolo TCP (Transfer Control Protocol)
A Conexão TCP, além de ser mais rápida, é mais precisa em questão de envio e recebimento de dados. Ou seja, mais velocidade de conexão com o computador remoto.
Etapas de uma conexão TCP
São exatamente três as etapas que se dividem em:
1) Verificação do número do IP e porta
2) Conexão com o usuário
3) Envio e recebimento de dados
Verificação de número do IP e porta
Esta é a etapa em que são utilizadas duas propriedades do Winsock:
1) RemoteHost
2) RemotePort
O RemoteHost serve para que seja indicado para o Winsock o número do IP do usuário, que pode ser tanto número do IP normal como 200.189.155.25 ou como sites da internet como www.imasters.com.br.
O RemotePort serve para que seja indicado para o Winsock a porta de conexão do computador remoto, o número da porta pode variar entre 0 e 65535.
Iniciando conexão com o servidor
A conexão deve ser iniciada depois de setadas as propriedades
RemoteHost e RemotePort , deve ser utilizada agora a FUNÇÃO
Connect como no exemplo a seguir:
Winsock1.Connect PortaRemota, IpRemoto
Logo após a utilização da função Connect, devemos aguardar a conexão com o usuário remoto, utilizando o EVENTO CONNECT . Este evento, ao se conectar ao computador será executado, podendo assim que o usuário envie os dados ou certifique-se de que está conectado ao usuário remoto.
Envio e recebimento de dados
Envio de Dados
Para enviar os dados a conexão com o servidor deve estar perfeita. Os dados são enviados utilizando a FUNÇÃO SendData e o texto a ser enviado (string) . Ex:.
Winsock1.SendData DadoEnviado
Existem dois EVENTOS que facilitam para programador o monitoramento do envio de dados que são:
1) SendComplete
Este evento é chamado assim que ultimo pacote é enviado por completo.
2) SendProgress
Este evento é chamado DURANTE a transmissão dos dados, neste evento existem duas variáveis que podem ajudar o usuário (principalmente durante o envio de arquivos) que são o BytesSent (Bytes enviados) e BytesRemaining (Bytes Restantes) .
Recebimento de Dados
O recebimento de dados é feito através do EVENTO DataArrival , este evento é chamado sempre que pacotes de dados são enviados na porta onde o winsock está conectado.
Neste EVENTO deve ser declarada uma string e utilizada a FUNÇÃO GETDATA da seguinte maneira:
Winsock1.GetData string, Tipo, Tamanho
"String" é a variável onde devem ser gravados os dados enviados pelo computador remoto, "Tipo" é o tipo dos dados que será recebido, e "Tamanho" é o tamanho máximo da string (em bytes) que será recebido.
Conexão pelo protocolo UDP (User Datagram Protocol)
UDP é um protocolo mais simples de ser utilizado com o Winsock, porém tem certos problemas de incompatibilidade, não temos certeza de que o computador remoto receberá realmente os dados enviados, já que não é utilizada nenhuma forma que alerte ao programa que o usuário está realmente conectado ou não (somente enviando e recebendo dados).
UDP é um protocolo que para os iniciantes seria o ideal aprender já que não tem muitos comandos "complicados" como o TCP. Tanto o envio como o recebimento de dados é utilizado da mesma maneira do protocolo TCP, porém a grande mudança é na conexão entre os computadores.
Conectando computadores remotos utilizando UDP.
A conexão entre computadores remotos utilizando UDP é muito fácil, são setadas as portas do computador remoto normalmente como em um protocolo TCP : RemoteHost e RemotePort .
Porém o método Connect não é utilizado em seu lugar é inserido o seguinte comando:
Winsock1.Bind LocalPort, LocalIP
Onde o LocalPort é setada a porta que deverá ser conectada, e o LocalIP é inserido o IP do computador remoto.
Conexão de múltiplos clientes (TCP somente).
Este tipo de conexão é um pouco difícil de explicar, mas farei o possível.
Primeiramente você pode realizar o seguinte teste, tente conectar dois Winsocks em uma única porta. Obviamente ele NÃO dará erro!
Vamos ver o porque agora:
Ao tentar se conectar com um usuário em uma porta qualquer, ela é mantida na memória, ou seja, aquele endereço é inserido na propriedade: LocalPort . Para fazer o teste basta tentar se conectar com algum computador remoto e pedir que ele informe qual o valor da propriedade LocalPort , logicamente (após o comando Connect for acionado) ela estará com o mesmo valor do RemotePort .
Para que este "limite" seja "burlado" devemos simplesmente "zerar" a propriedade LocalPort , vamos dizer que acabamos de conectar com um computador remoto, devemos então "zerar" esta porta para que outro controle ou programa possa utilizar aquela mesma porta para conectar com outros computadores.
Private Sub Winsock1_Connect()
'Quando entrar nesta rotina ele já estará conectado...
'agora iremos "zerar" a propriedade...
Winsock1.LocalPort = 0
'Daqui pra frente programa normal.
End Sub
No exemplo a seguir o que fizemos foi "zerar" a porta para que outros programas ou até mesmo que o próprio programa utilize novamente aquela porta.
Este é o primeiro e principal passo para montar programas com múltiplos clientes ou servidores.
Recebendo conexões (servidor).
Até agora vimos como conectar com o computador remoto, como conectar com múltiplos computadores remotos, mas está faltando uma coisa, como é que recebo uma conexão?
Isso é uma boa pergunta. Bom o grande segredo de um servidor, que suporta múltiplos clientes, é simples depois, que se aprende, só que para aprender tem que gostar bastante do assunto.
O primeiro passo para se "aguardar" uma conexão remota é o seguinte:
Private Sub Command1_Click() 'Um botão qualquer...
Winsock1.Close 'Fecha o controle
Winsock1.RemotePort = nPorta 'Seta a porta para "aguardar" a conexão...
Winsock1.Listen 'Inicia o "aguardo" de computadores remotos...
End Sub
NOTA: Neste exemplo gostaria de colocar em relevo algo realmente muito importante, ao se clicar em um botão ou iniciar uma nova conexão é SUPER IMPORTANTE que seja "descarregado" o controle com o comando "Close" para que as novas propriedades sejam inseridas.
ConnectionRequest
Esta é uma rotina muito interessante e importante também quando se quer fazer um servidor de múltiplos clientes ou de apenas 1 único cliente, esta rotina serve para que quando um usuário tente se conectar naquela porta, ela execute para que o programador defina se o programa deve ou não aceitar a conexão.
Devemos tomar certos cuidados nesta rotina para que seja mais bem aproveitada possível:
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
'Este requestID é o número do IP do computador que deseja iniciar a 'conexão...
Winsock1.Accept requestID
'Fecha a porta do controle para o uso da porta mais tarde...
Winsock1.LocalPort = 0
End Sub
A função Accept serve para que seja "aceita" a conexão com o computador local, logo após que o Accept é iniciado ele continua o processo de conexão e conecta com o computador remoto, chamando a rotina Conect que vimos anteriormente.
Agora você já sabe a forma de conexão e como se conectar, mas temos que tomar alguns cuidados em conexões e procurar sempre se aperfeiçoar.
Bom, por enquanto vou ficando por aqui. Na semana que vem continuo a matéria. Até lá e não se esqueçam: qualquer dúvida mandem para meu e-mail. Prometo responder a todos.
Abraço a todos.
Spek Weymon Kenebrish
Quando coloco o comando pra "zerar" a porta da erro :( uso o VB6, me ajuda aew na moral meu rey :P
Wilian Marangoni
tentei usar a rotina para aguardar conexoes como vc descreveu acima
Private Sub Command1_Click() 'Um botão qualquer...
Winsock1.Close 'Fecha o controle
Winsock1.RemotePort = nPorta 'Seta a porta para "aguardar" a conexão...
Winsock1.Listen 'Inicia o "aguardo" de computadores remotos...
End Sub
mas nao consegui usando winsock.remotePort
nao seria winsock.LocalPort?
Wilian Marangoni
tentei usar a rotina para aguardar conexoes como vc descreveu acima
Private Sub Command1_Click() 'Um botão qualquer...
Winsock1.Close 'Fecha o controle
Winsock1.RemotePort = nPorta 'Seta a porta para "aguardar" a conexão...
Winsock1.Listen 'Inicia o "aguardo" de computadores remotos...
End Sub
mas nao consegui usando winsock.remotePort
nao seria winsock.LocalPort?
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.