VB - Winsock Tutorial

Started by Dark_Side, 03 de July , 2006, 04:16:24 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

VB - Winsock Tutorial by Dark Side
********************************************
Hi, desta vez estou postando um tutorial sobre como trabalhar com o controle Winsock no Visual Basic.
Obs:: Utilizarei a versão 6.0 do programa.

Índice
*********************************
» Introdução sobre o winsock
» Iniciando
» Propriedades do winsock e membros do winsock
» Eventos do Winsock
» Lidando com erros e estados de conexão
» Código de exemplo
» Considerações finais

Introdução sobre o winsock
**********************************************
O componente winsock, presente no Windows, é um dos componentes mais interessantes que podemos citar. Com ele por exemplo, podemos criar chats, jogos multiplayers, clientes de email, e uma variedade de aplicações que use a internet como foco. Sua aplicação em Visual Basic, é bem simples, como veremos a seguir.

Iniciando
**********************************************
1) Inicie o Visual Basic e crie um projeto Standard EXE.
2) Pressione CTRL+T ou vá em Project-> Components, e adicione o controle: Microsoft Winsock Control 6.0
3) Adicione no form, o objeto WINSOCK, que se encontra na barra de componentes à esquerda.


Propriedades do winsock e membros do winsock
**********************************************
Ao adicionar o objeto no formulário, observando suas propriedades, temos:

Name: nome do controle
Index: especifica se o controle é uma array.
Left: Posicionamento à esquerda
Localport: porta local do winsock
Protocol: 0 - sckTCPProtocol(PROTOCOLO TCP) ou 1 -sckUDPProtcol(PROTOCOLO UDP)
RemoteHost: host que iremos nos conectar
RemotePort: porta que iremos nos conectar
Tag: informações extra
Top: posicionamento vertical

Temos os seguintes membros constituintes do componente:

Accept -> Aceita uma conexão
Sintaxe: winsock.accept(resquestid)
Onde resquestid é o valor da requisição

Bind -> Binda o winsock
Sintaxe: winsock.Bind(portalocal,iplocal)
BytesReceived -> Retorna o número de bytes recebidos


Close -> Fecha uma conexão
Sintaxe: winsock.close

Connect -> Conecta à um host
Sintaxe: winsock.connect - quando um host e porta já foram especificados - ou winsock.connect(host,porta) caso contrário.

GetData -> Obtém dos dados recebidos em uma variável
Sintaxe: winsock.getdata(variavel,tipo,max)
Onde:
Variavel = variavel que armazenará os dados

Opicionais:
tipo = tipo de dados: vbstring(padrao), vblong(inteiro), vbsingle(float),vbdouble(double).
Max = tamanho máximo de dados a receber.

Listen -> Coloca o socket em modo de espera
Sintaxe: winsock.listen

LocalHostName -> Mostra o nome do host local.
LocalIp -> Obtém o IP local
LocalPort -> Obtém/Configura a Porta local
Protocol -> Obtém/configura o protocolo: sckTCPProtocol ou sckUDPProtocol.
RemoteHost -> Obtém/Configura hostname do host.
RemoteHostIP -> Obtém o IP do host.
RemotePort -> Obtém/Configura a porta remota.

SendData -> Envia dados ao host remoto.
Sintaxe: winsock.senddata(data)
Onde data é o que se será enviado.

State -> Obtém o estado do socket(serão listados adiante).

Eventos do Winsock
**********************************************
Vimos as propriedades e membros do winsock, veremos agora a parte mais interessante em termos de interatividade.

Evento Close
Ocorre quando o socket é fechado

Sintaxe:
Private Sub Winsock1_Close()
' código aqui
End Sub

Evento Connect
Ocorre quando uma conexão é completada

Sintaxe:
Private Sub Winsock1_Connect()
'código aqui
End Sub

Evento DataArrival
Ocorre quando são recebidos dados.

Sintaxe:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'código aqui
End Sub
Onde bytestotal = número de bytes recebidos

Evento Error
Ocorre quando foi resultado um erro.

Sintaxe:
Private Sub ws_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'Codigo aqui
End Sub
Os valores que nos interessa:

number = número do erro
Description = descrição do erro


Evento SendComplete
Ocorre quando o envio de dados é completado

Sintaxe:
Private Sub Winsock1_SendComplete()
'código aqui
End Sub

Evento SendProgress
Ocorre quando dados estão sendo enviados

Sintaxe:
Private Sub Winsock1_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
'código aqui
End Sub

Onde:
bytesSent = número de bytes enviados;
bytesRemaining = número de bytes restantes.

Lidando com erros e estados de conexão
**********************************************
Abaixo listarei as constantes que representam o comportamento do winsock, ao longo do processo.

Erros mais comuns:

sckAddressInUse -> Ocorre quando a porta utilizada na tentativa de colocar o socket em modo listen, já estiver sendo usada.
sckAddressNotAvaiable -> Ocorre quando na função Bind, é espeficifado um IP local inválido.
sckAlreadyConnect -> Ocorre quando o socket já estiver conectado e um pedido para que ele conecte-se é feito, sem fechá-lo previamente.
sckBadState -> O estado do socket não permite tal operação.
sckConnectAborted -> A conexão foi cancelada.
sckConnectRefused -> Conexão recusada.
sckConnectionReset -> A conexão foi reiniciada.
sckHostNotFound -> Host não encontrado.
sckTimedout -> Tempo esgotado
sckWrongProtocol -> protocolo incorreto

Manipulando erros:
Exemplo:
Function enviar()
On Error GoTo verificar
Winsock1.SendData ("ENVIAR DADOS POR TCP SEM CONECTAR-SEANTES OCASIONA EM ERRO")
Exit Function
verificar:
Select Case Err.Number
Case sckBadState:
End
End Select
End Function
No exemplo acima, caso ocorra algum erro, a função é interrompida e salta para 'verificar'. Será verificado o número do erro, se for o erro referente à sckBadState, o programa encerra.

Pode-se usar o evento ERROR em algumas ocasiões.
Exemplo:
Private Sub winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
select case number
case sckTimedout
MsgBox Description
end select
winsock1.Close
End Sub
Estados do socket:

sckClosed -> Socket fechado.
sckClosing -> Socket fechando.
sckConnecting -> Em processo de conexão.
sckConnectionPending -> Pedido de conexão aguardando.
sckError -> Erro no socket.
sckHostResolved -> Host resolvido.
sckListening -> Aguardando conexões.
sckOpen -> Socket pronto para uso.
SckResolvingHost -> Resolvendo host.

Manipulando estados:
Exemplo:
Function ver_estado()
Select Case Winsock1.State
Case sckClosed:
MsgBox "Socket fechado"
Winsock1.LocalPort = 1234
Winsock1.Listen
Case sckListening:
MsgBox "Socket aguardando..."
Winsock1.Close
End Select
End Function

Código de exemplo
**********************************************
Abaixo segue o código de um simples chat em VB:

Download source code + executáveis:
http://three.fsphost.com/darkside/chat_vb.rar

Considerações finais
**********************************************
Bem, termino aqui de passar o pouco que sei com vocês. Espero ter ajudado.
Bye.  ;D

Sladrak

Vlw dark side!

Eh sempre bom ter exemplos e explicaçoes facilita e ajuda muito!!

Pena q nao estou tendo tempo para estudar =/

Mas to dando 1 olhadinha no chat aki... Irei ver se entendo tudo heheh

branco

creio que esteja otimo pelo visto,to voltando agora e assim que tiver duvida irei consultar seu tutorial, valew ae  ;)
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?