VB - Winsock Tutorial
Descrição : tutorial sobre como trabalhar com o controle Winsock no Visual Basic.
Í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
► 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
Código de exemplo : winsock.accept(resquestid)
Onde resquestid é o valor da requisição
Bind -> Binda o winsock
Código:
winsock.Bind(portalocal,iplocal)
BytesReceived -> Retorna o número de bytes recebidos
Close -> Fecha uma conexão
Connect -> Conecta à um host
Código:
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
Código:
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
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.
Código:
winsock.senddata(data)
Onde data é o que se serí en*****.
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
Código:
Private Sub Winsock1_Close()
' código aqui
End Sub
Evento Connect
Ocorre quando uma conexão é completada
Código:
Private Sub Winsock1_Connect()
'código aqui
End Sub
Evento ConnectionRequest
Ocorre quando hí um pedido de conexão
Código:
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
'código aqui
End Sub
Onde requestID = ID do pedido de conexão a aceitar.
Evento DataArrival
Ocorre quando são recebidos dados.
Código:
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.
Código:
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
Código:
Private Sub Winsock1_SendComplete()
'código aqui
End Sub
Evento SendProgress
Ocorre quando dados estão sendo en*****s
Código:
Private Sub Winsock1_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
'código aqui
End Sub
Onde:
bytesSent = número de bytes en*****s;
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:
Código:
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:
Código:
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:
Código:
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
Bem , é isso, Espero que Com esse Tutorial Vocês Aprendam um Pouco Mais Sobre o Winsock.
Creditos: dark_side
Fonte: Pro Code