PROBLEMAS COM WINSOCK
Não estou conseguindo conectar com o Winsock. O servidor recebe a requisição, aceita, mas lá no cliente o estado do Winsock é sempre conectando e não conecta nunca.
Será q alguém pode me dar uma luz ?
Resumindo os fontes do servidor:
Private Sub MDIForm_Load()
Dim IPLocal As String
IPLocal = sckCliente(0).LocalIP
sckCliente(0).LocalPort = 9999
sckCliente(0).Listen
End Sub
Private Sub sckCliente_ConnectionRequest(Index As Integer, ByVal requestID As Long)
sckConexao = sckConexao + 1 ' variável declarada pública no módulo
Load sckCliente(sckConexao)
If sckCliente(sckConexao).State sckClosed Then sckCliente(sckConexao).Close
sckCliente(sckConexao).Accept requestID
sckCliente(sckConexao).SendData "CONEXÃO ACEITA"
End Sub
Private Sub sckCliente_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
sckCliente(Index).GetData strData
End Sub
Private Sub sckCliente_Error(Index As Integer, 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)
sckCliente(sckConexao).Close
Unload sckCliente(sckConexao)
End Sub
Os fontes do cliente:
Public Function ServerAlive(IP As String) As Boolean
Conectado = False ' Variável private do form
sckServer.RemoteHost = IP
sckServer.RemotePort = 9999
sckServer.Connect
TentativasConexao = 0 ' Variável private do form
Do While TentativasConexao 6
Sleep 1000 ' API
If sckServer.State = sckConnected Then
sckServer.SendData Usuario
Conectado = True
End If
TentativasConexao = TentativasConexao + 1
If Conectado Then
Exit Do
End If
Loop
sckServer.Close
ServerAlive = Conectado
End Function
Será q alguém pode me dar uma luz ?
Resumindo os fontes do servidor:
Private Sub MDIForm_Load()
Dim IPLocal As String
IPLocal = sckCliente(0).LocalIP
sckCliente(0).LocalPort = 9999
sckCliente(0).Listen
End Sub
Private Sub sckCliente_ConnectionRequest(Index As Integer, ByVal requestID As Long)
sckConexao = sckConexao + 1 ' variável declarada pública no módulo
Load sckCliente(sckConexao)
If sckCliente(sckConexao).State sckClosed Then sckCliente(sckConexao).Close
sckCliente(sckConexao).Accept requestID
sckCliente(sckConexao).SendData "CONEXÃO ACEITA"
End Sub
Private Sub sckCliente_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
sckCliente(Index).GetData strData
End Sub
Private Sub sckCliente_Error(Index As Integer, 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)
sckCliente(sckConexao).Close
Unload sckCliente(sckConexao)
End Sub
Os fontes do cliente:
Public Function ServerAlive(IP As String) As Boolean
Conectado = False ' Variável private do form
sckServer.RemoteHost = IP
sckServer.RemotePort = 9999
sckServer.Connect
TentativasConexao = 0 ' Variável private do form
Do While TentativasConexao 6
Sleep 1000 ' API
If sckServer.State = sckConnected Then
sckServer.SendData Usuario
Conectado = True
End If
TentativasConexao = TentativasConexao + 1
If Conectado Then
Exit Do
End If
Loop
sckServer.Close
ServerAlive = Conectado
End Function
ok - vamos ver...
vamos ao mais simples possivel...
server:
Private sub Form_Load()
sckCliente(0).localport = 9999
sckcliente(0).listen
end sub
Private Sub sckCliente_ConnectionRequest(Index As Integer, ByVal requestID As Long)
on error goto trataerro
dim i as integer
load sckcliente(i)
sckcliente(i).accept requestID
sckcliente(i).senddata "OK"
DOEVENTS
exit sub
TrataErro:
i=i+1
resume
End Sub
Private Sub sckCliente_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
sckCliente(Index).GetData strData
msgbox strData
End Sub
Private Sub sckCliente_Error()
sckCliente(sckConexao).Close
Unload sckCliente(sckConexao)
End Sub
'cliente
Private Sub Conectar(byval IP as string, Byval Port as long)
sckServer.Connect IP, Port
end sub
Private Sub sckServer_Connect()
msgbox "Conectado!"
sckserver.senddata "OK"
doevents
end Sub
Private Sub sckServer_DataArrival( ByVal bytesTotal As Long)
Dim strData As String
sckServer.GetData strData
msgbox strData
End Sub
isso aqui funciona - nao vi nada de errado em seu codigo - mudaria a forma de controle de indice de seu servidor (os numeros nunca vao ser continuos - isso pode dar dor de cabeca pra vc mais cedo ou mais tarde - nao vao ser continuos pois se entra 2 , sai o primeiro e entra outro - o indice do primeiro ta vago (nao sei se ta claro - mas eu mudaria))
e daria tb um doevents embaixo de cada instrucao SendData - ja vi casos de mensagens nao enviadas (na verdade bufferizadas) ate o primeiro "momento livre" para o envio - e o doevents garante este momento
vamos ao mais simples possivel...
server:
Private sub Form_Load()
sckCliente(0).localport = 9999
sckcliente(0).listen
end sub
Private Sub sckCliente_ConnectionRequest(Index As Integer, ByVal requestID As Long)
on error goto trataerro
dim i as integer
load sckcliente(i)
sckcliente(i).accept requestID
sckcliente(i).senddata "OK"
DOEVENTS
exit sub
TrataErro:
i=i+1
resume
End Sub
Private Sub sckCliente_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
sckCliente(Index).GetData strData
msgbox strData
End Sub
Private Sub sckCliente_Error()
sckCliente(sckConexao).Close
Unload sckCliente(sckConexao)
End Sub
'cliente
Private Sub Conectar(byval IP as string, Byval Port as long)
sckServer.Connect IP, Port
end sub
Private Sub sckServer_Connect()
msgbox "Conectado!"
sckserver.senddata "OK"
doevents
end Sub
Private Sub sckServer_DataArrival( ByVal bytesTotal As Long)
Dim strData As String
sckServer.GetData strData
msgbox strData
End Sub
isso aqui funciona - nao vi nada de errado em seu codigo - mudaria a forma de controle de indice de seu servidor (os numeros nunca vao ser continuos - isso pode dar dor de cabeca pra vc mais cedo ou mais tarde - nao vao ser continuos pois se entra 2 , sai o primeiro e entra outro - o indice do primeiro ta vago (nao sei se ta claro - mas eu mudaria))
e daria tb um doevents embaixo de cada instrucao SendData - ja vi casos de mensagens nao enviadas (na verdade bufferizadas) ate o primeiro "momento livre" para o envio - e o doevents garante este momento
Tópico encerrado , respostas não são mais permitidas