[Ayuda]Problema con winsock en vb6

Iniciado por mardek, 1 Agosto 2010, 06:19 AM

0 Miembros y 2 Visitantes están viendo este tema.

mardek

Hola gente como andan? Paso a comentarles mi problema. Estoy haciendo un programa tipo chat en el que yo mediante un textbox que tengo en el cliente , le envio informacion a el server. El problema es que no puedo lograr la conexión( siempre se queda en Estado - Esperando Conexión...) , estuve leyendo muchos tutoriales hoy y la verdad es que no se en que la estoy pifiando... Quisiera saber si alguno puede ver el error y me diga asi lo puedo corregir.

Trate de subir el programa a un servidor pero se procucía un error

Codigo Cliente Chat:
Código (vb) [Seleccionar]
Private Sub Boton_Conexion_Click()
On Error Resume Next
WS.Close
WS.Connect TxtIP.Text, 1066
End Sub

Private Sub WS_Connect()
SB.Caption = "Estado - Conectado (" & WS.RemoteHostIP & ")"
End Sub
Private Sub Boton_Desconexion_Click()
WS.Close
SB.Caption = "Estado - Desconectado (" & WS.RemoteHostIP & ")"
End Sub

Private Sub WS_Close()
SB.Caption = " Estado - Cerrando Conexión (" & WS.RemoteHostIP & ")" & vbCrLf
SB.Caption = "Estado - Esperando Conexión..." & vbCrLf
WS.Listen
End Sub

Private Sub Command1_Click()
WS.SendData Text2.Text
End Sub


Codigo server chat

Código (vb) [Seleccionar]
Public WithEvents WS As CSocketMaster

Private Sub Form_Load()
Set WS = New CSocketMaster
On Error Resume Next
WS.LocalPort = 1066
WS.Listen
End Sub

Private Sub WS_onClose()
WS.CloseSck
WS.Listen
End Sub

Private Sub WS_onConnectionRequest(ByVal requestID As Long)
WS.CloseSck
WS.Accept requestID
End Sub

Private Sub WS_DataArrival(ByVal bytesTotal As Long)
Temp = Text2.Text
WS.GetData Temp


Eso es todo. Graciar por haber entrado para ayudarme con este problema.
Saludos y que tengan un buen día

BlackZeroX

#1
solo unos cambios radicales... usa Geshi ( [code=vb]codigo vb[/code] ) no se puede leer asi tu codigo!¡.

EDITO (Por que me saltaron muchos Horrores!¡.)!¡:

pero viendo un poco el cogido solo te dire que hay unos If THEN y algunos mensajes que se obvian en los eventos, por ejemplo!¡.

Código (vb) [Seleccionar]

Private Sub WS_Connect()
If (WS.State = sckConnected) Then
SB.Caption = "Estado - Conectado (" & WS.RemoteHostIP & ")"
End If
End Sub


quedaría así...

Código (vb) [Seleccionar]

Private Sub WS_Connect()
SB.Caption = "Estado - Conectado (" & WS.RemoteHostIP & ")"
End Sub


esto!¡.

Código (vb) [Seleccionar]

Private Sub WS_Close()
SB.Caption = " Estado - Cerrando Conexión (" & WS.RemoteHostIP & ")" & vbCrLf
WS.Close
SB.Caption = "Estado - Esperando Conexión..." & vbCrLf
WS.Listen
End Sub


aa...

Código (Vb) [Seleccionar]

Private Sub WS_Close()
SB.Caption = " Estado - Cerrando Conexión (" & WS.RemoteHostIP & ")" & vbCrLf
SB.Caption = "Estado - Esperando Conexión..." & vbCrLf
WS.Listen
End Sub


etc...

Ahora en un .Caption no tiene caso & vbCrLf !¡.

un error

Código (vb) [Seleccionar]

Private Sub Command1_Click()
WS.SendData "Text2.Text"
End Sub


seria a

Código (vb) [Seleccionar]

Private Sub Command1_Click()
WS.SendData Text2.Text
End Sub


OffTopic:

Aquí tienes un CTL ( Control de usuario, para que trabajes el CSocketMAster como el Winsock  xP solo cambia la propiedad .close a .closesck, es la única diferencia en el manejo habitual )

http://infrangelux.sytes.net/filex/?file=/BlackZeroX/Programacion/vb6/CSocketMaster.rar&dir=/BlackZeroX/Programacion/vb6&

The Dark Shadow is my passion.

mardek

#2
Hola muchas gracias por interesarte, ya cambie el codigo. Mirare el link que me diste.
Muchas gracias devuelta

EDITO:
muchas gracias por las sugerencias que me diste, lo voy a corregir Gracias

BlackZeroX

#3
Ve los cambios qué te puse!¡.

no me cites hasta ahora soy el único qué te he escrito ademas se entiende el hilo!¡.

Edito:

El error parece estar aquí (Cambiando el Status del RaiseEvent del Modulo de clase del mismo estaría bien pero mejor Obviar qué reafirmar!¡. ).

Código (vb) [Seleccionar]


Private Sub WS_Connect()
If (WS.State = sckConnected) Then
SB.Caption = "Estado - Conectado (" & WS.RemoteHostIP & ")"
End If
End Sub



intenta a ponerlo así

Código (Vb) [Seleccionar]


Private Sub WS_Connect()
SB.Caption = "Estado - Conectado (" & WS.RemoteHostIP & ")"
End Sub



Dulces Lunas!¡.
The Dark Shadow is my passion.

mardek

#4
Hola muchas gracias por interesarte, ya cambie el codigo. Mirare el link que me diste.
Muchas gracias devuelta

EDITO:
muchas gracias por las sugerencias que me diste, lo voy a corregir Gracias

EDITO:
Cambie los codigos a como me digiste pero sigo con el problema, se queda en Estado - Esperando Conexión...

muchas gracias

BlackZeroX

mm es que tanto el cliente como el servidor tienen escuchan en un momento dado!¡.

revisa!¡ el evento close del cliente xP no deberia ser connect?, digo el cliente es el que se va a conectar mas no el que va a esperar la conexión del servidor, dado que el servidor no tiene el .connect ...

Dulces Lunas!¡.
The Dark Shadow is my passion.

BlackZeroX

Citare tu código original para qué te des cuenta de lo dicho!¡.

Código (vb,4,18) [Seleccionar]

Private Sub Boton_Conexion_Click()
On Error Resume Next
WS.Close
WS.Connect TxtIP.Text, 1066
End Sub

Private Sub WS_Connect()
SB.Caption = "Estado - Conectado (" & WS.RemoteHostIP & ")"
End Sub
Private Sub Boton_Desconexion_Click()
WS.Close
SB.Caption = "Estado - Desconectado (" & WS.RemoteHostIP & ")"
End Sub

Private Sub WS_Close()
SB.Caption = " Estado - Cerrando Conexión (" & WS.RemoteHostIP & ")" & vbCrLf
SB.Caption = "Estado - Esperando Conexión..." & vbCrLf
WS.Listen
End Sub

Private Sub Command1_Click()
WS.SendData Text2.Text
End Sub


Sangriento Infierno Lunar!¡.
The Dark Shadow is my passion.

mardek

#7
ok vere eso, la respuesta de si era ese el error la posteo dentro de unas horas porque me debo ir.

Muchas gracias BlackZeroX por ayudarme!!

saludos y que tengas un buen dia

EDITO:
BlackZeroX hice lo siguiente, elimine el evento WS_Close, y lo ordene de la siguiente manera

Código (vb) [Seleccionar]
Private Sub Boton_Conexion_Click()
On Error Resume Next
WS.Close
WS.Connect TxtIP.Text, 1066
End Sub

Private Sub WS_Connect()
SB.Caption = "Estado - Esperando Conexión..." & vbCrLf
SB.Caption = "Estado - Conectado (" & WS.RemoteHostIP & ")"
End Sub

Private Sub Boton_Desconexion_Click()
SB.Caption = " Estado - Cerrando Conexión (" & WS.RemoteHostIP & ")" & vbCrLf
WS.Close
SB.Caption = "Estado - Desconectado (" & WS.RemoteHostIP & ")"
End Sub

Private Sub Command1_Click()
WS.SendData Text2.Text
End Sub


De esta manera me queda en el Label (SB) que estoy conectado. Entonces procedo a escribir en el textbox, una oración, apreto el botón enviar (command1) y me marca: Error en tiempo de ejecución: 40006

"Protocolo o estado de conexión erróneo para la transacción o petición solicitada".


Busque en la web y me dice que ese error se produce cuando se trata de enviar un dato antes de que se esté conectado al server. Con esto significaria que en realidad no estoy conectado al server y el Label(SB) me muestra que sí.

Gracias

BlackZeroX

#8
hay te falta un if then!¡

Código (Vb) [Seleccionar]


Private Sub Command1_Click()
WS.SendData Text2.Text
End Sub



asi

Código (vb) [Seleccionar]

Private Sub Command1_Click()
   with ws
       if .state=7 then
           .SendData Text2.Text
       else
           if .state = 0 or .state= 9 or .state= 8 then ' // me parece que son estos los estados negativos en una conexion xP!¡
                If MsgBox("Nesesitas realizar una conexion antes!¡." & vbNewLine & "Deseas conectarte ahora?",vbYesNo ,"") = vbYes Then
                   sb.caption = "conectando al Servidor!¡..."
                   .Connect TxtIP.Text, 1066
               end if
           end if
       end if
   end with
End Sub


ahora ve aqui

Código (Vb) [Seleccionar]

Private Sub WS_Connect()
SB.Caption = "Estado - Esperando Conexión..." & vbCrLf
SB.Caption = "Estado - Conectado (" & WS.RemoteHostIP & ")"
End Sub


no hay caso esos dos caption (ya que es muy rapido uq lo unico que veras será el ultimo set al caption!¡.)"¡.

Código (Vb) [Seleccionar]

Private Sub WS_Connect()
SB.Caption = "Estado - Conectado (" & WS.RemoteHostIP & ")"
End Sub




P.D.: Indenta tu código (Usa la tecla Tab (Tabulador)!¡.), y si puedes sube tu codigo para verlo mejor!¡.

Sangriento Infierno Lunar!¡.
The Dark Shadow is my passion.

mardek

#9
Hola BlackZeroX puse el codigo que me digiste pero me dice que debo realizar una conexion, quiere decir que aunque en el label (SB) me diga que estoy conectado enrealidad no lo estoy.

Gracias