Programación General > Visual Basic 6.0 e inferiores

 Problemas Con Winsock

(1/2) > >>

Jose Arriagada:
Tengo un cliente y un servidor, que se comunican con winsock.

El servidor funciona de maravilla. Responde a todo y controla toda. Cero problema.

El tema que me complica es lo siguiente:
El cliente, tiene 3 (tres) botones
- cmdConect
- cmdSend
- cmdClose

Si se presionan en forma consecutiva, y en la secuencia anteriormente descrita, todo funciona bien. Se comunica sin problemas con el servidor, y obtengo respuesta.

Pero, si en un solo boton, activo el evento click de cada uno de estos 3 (tres) botones, NO logro la comunicacion con el servidor.

Adjunto el codigo del cliente, para que lo prueben...

Option Explicit

Public Sub cmdClose_Click()
cmdConnect.Enabled = True
cmdSend.Enabled = False
cmdClose.Enabled = False
End Sub

Public Sub cmdConnect_Click()
Winsock1.RemoteHost = "10.0.3.150"
Winsock1.RemotePort = 1007
Winsock1.Connect
txtRespuesta.Text = ""
cmdConnect.Enabled = False
cmdSend.Enabled = True
cmdClose.Enabled = True
txtMensajeEnviar.SetFocus
End Sub

Public Sub cmdSend_Click()
If Winsock1.State = sckConnected Then
    Winsock1.SendData txtMensajeEnviar.Text
    Label3.Caption = "Sending Data"
Else
    Label3.Caption = "No se puede conectar a host"
End If
End Sub

Private Sub cmdStatus_Click()
Label3.Caption = "Estado:" & Winsock1.State
End Sub

Private Sub cmdTodosJuntos_Click()
Call cmdConnect_Click
Call cmdSend_Click
Call cmdClose_Click
End Sub

Private Sub Form_Load()
txtMensajeEnviar.Text = "asdfasdfasdf"
txtRespuesta.Text = ""
Label3.Caption = ""
txtIP.Text = Winsock1.LocalIP
End Sub


Private Sub Winsock1_Connect()
Select Case Winsock1.State
    Case 0: Label3.Caption = "Cerrada"
    Case 1: Label3.Caption = "Abierta"
    Case 2: Label3.Caption = "Escuchando"
    Case 3: Label3.Caption = "Solicitud pendiente"
    Case 4: Label3.Caption = "Resolviendo Conexion"
    Case 5: Label3.Caption = "Resuelta Conexion"
    Case 5: Label3.Caption = "Resuelta Conexion"
    Case 6: Label3.Caption = "Conectandose"
    Case 7: Label3.Caption = "Conectado"
    Case 8: Label3.Caption = "Cerrando"
    Case 9: Label3.Caption = "Error"
End Select
Label3.Caption = Winsock1.State & ":" & Label3.Caption
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sData As String
Winsock1.GetData sData, vbString
txtRespuesta.Text = sData
Label3.Caption = "Received Data"
End Sub

Private Sub Winsock1_SendComplete()
Label3.Caption = "Completed Data Transmission"
End Sub


Si se dan cuenta, al presionar el boton cmdTodosJuntos, NO se activa el evento CONNECT del winsock.


Alguien sabe como resolver este tema?

martin campos quintero:
Hola José, ya descubrí el error que tienes.

El error está en la función

Private Sub cmdTodosJuntos_Click()
Call cmdConnect_Click
Call cmdSend_Click
Call cmdClose_Click
End Sub

esa función por alguna razón falla al hacer las llamadas con "Call", así que para que no falle debes ponerlo de la siguiente manera:

Private Sub cmdTodosJuntos_Click()
  cmdConnect_Click
  cmdSend_Click
  cmdClose_Click
End Sub


Tu código en la primera ejecución no falla, pero después que lo ejecutas de nuevo, es donde viene el fallo. Así que si se bloquea y ya no quiere trabajar, entonces crea un nuevo formulario y ahí pásale todo el código con los controles. Entonces haz la modificación que te dije.

Espero te funcione. Saludos.

Jose Arriagada:
Gracias por tu colaboracion

Voy a probar!!!!

Mathais:
Mira yo tambien he tenido problemas con programa que he desarrollado y el problema es el tiempo que hay que esperar entre la conexion del sock y el envio del mensaje, es decir si estan todas las instrucciones juntas tendras que insertarle una funsion de espara de al menos 200ms y el problema se soluciona tambien aveses desde el server tambien tienes que pomar recaudos por que cuando la transmision no se concreta el sock en el server queda tildado asi que luesog de recibir un mensaje del cliente te convendria seccarlo y listarlo nuevamnete. Espero que mi breve reseña te sirva de algo

jpaler:
creo q Mathais tiene toda la razon.

el socket no se conecta instantaneamente con solo llamar a Connect, requiere
un intervalo de tiempo prudente mientras se comunica y establece la conexion.
entonces lo unicoq tienes q hacer es un retardo antes de enviar el dato:
 

   Connect()
         delay(500)
   Send("Hola mundo  !!!")
   Close()

...

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa