PROBLEMAS COM WINSOCK

USUARIO.EXCLUIDOS 03/04/2004 00:43:08
#18624
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
USUARIO.EXCLUIDOS 03/04/2004 10:10:41
#18653
Resposta escolhida
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
Tópico encerrado , respostas não são mais permitidas