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.
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 e Membros
Ao adicionar o objeto no formulário, observando suas propriedades:
Name: Nome do Controle
Index: Especifica se é um array de controles
Left: Posicionamento à esquerda
Localport: Porta local
Protocol: 0 - sckTCPProtocol(TCP) ou 1 - sckUDPProtcol(UDP)
RemoteHost: Host alvo para conectar
RemotePort: Porta alvo para conectar
Tag: Informações Extra
Top: Posicionamento Vertical
Membros do componente:
Accept:
Aceita uma conexão.
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Winsock.Accept(requestID)
resquestID é o valor da requisição
Bind:
Binda o winsock.
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Winsock.Bind(PORTA_LOCAL,IP_LOCAL)
BytesReceived:
Retorna o número de bytes recebidos
Close:
Fecha uma conexão
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Winsock.Close
Connect:
Conecta à um host
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Winsock.Connect 'Quando um host e porta já foram especificados
Winsock.Connect(IP, Porta)
GetData:
Obtém dos dados recebidos em uma variível
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Winsock.GetData(Variavel, Tipo, Max)
Variavel= Variavel que armazenará os dados
Opcionais:
Tipo = Tipo de dados: vbstring(padrao), vblong(inteiro), vbbyte
Max = Tamanho máximo de dados a receber.
Listen:
Coloca o socket em modo de espera
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
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 e 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
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Winsock.Senddata(Data)
Data = O que será enviado
State: Obtém o estado do socket (listados adiante)
Eventos
Vimos as propriedades e membros do winsock, veremos agora a parte mais interessante em termos de interatividade.
Close:
Ocorre quando o socket é fechado
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Private Sub Winsock1_Close()
' Códigos
End Sub
Connect:
Ocorre quando uma conexão é completada
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Private Sub Winsock1_Connect()
' Códigos
End Sub
ConnectionRequest:
Ocorre quando há um pedido de conexão
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
' Códigos
End Sub
requestID = ID do pedido de conexão a aceitar
DataArrival:
Ocorre quando são recebidos dados.
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
' Códigos
End Sub
bytestotal = número de bytes recebidos
Error:
Ocorre quando foi resultado um erro.
Code: -------------------------------------------------------------Selecionar conteúdo
- 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)
' Códigos
End Sub
Os valores que nos interessa
number = número do erro
description = descrição do erro
SendComplete:
Ocorre quando o envio de dados é completado
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Private Sub Winsock1_SendComplete()
' Códigos
End Sub
SendProgress:
Ocorre quando dados estão sendo enviados
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Private Sub Winsock1_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
' Códigos
End Sub
bytesSent = número de bytes enviados
bytesRemaining = número de bytes restantes
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 fecha-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 1:
Code: -------------------------------------------------------------Selecionar conteúdo
- Código:
Function Enviar()
On Error GoTo verificar
Winsock1.SendData ("Enviar dados por TCP sem conectar-se antes, 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 2:
Code: -------------------------------------------------------------Selecionar conteúdo
- 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 1:
Code: -------------------------------------------------------------Selecionar conteúdo
- 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
Por: DarK_Side e FusioN