• Jueves 14 de Noviembre de 2024, 03:52

Autor Tema:  Problemas Con Winsock  (Leído 2251 veces)

Jose Arriagada

  • Miembro MUY activo
  • ***
  • Mensajes: 373
    • Ver Perfil
Problemas Con Winsock
« en: Martes 8 de Noviembre de 2005, 16:56 »
0
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

  • Miembro MUY activo
  • ***
  • Mensajes: 113
  • Nacionalidad: 00
    • Ver Perfil
Re: Problemas Con Winsock
« Respuesta #1 en: Viernes 11 de Noviembre de 2005, 07:57 »
0
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

  • Miembro MUY activo
  • ***
  • Mensajes: 373
    • Ver Perfil
Re: Problemas Con Winsock
« Respuesta #2 en: Viernes 11 de Noviembre de 2005, 13:28 »
0
Gracias por tu colaboracion

Voy a probar!!!!

Mathais

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Problemas Con Winsock
« Respuesta #3 en: Martes 14 de Marzo de 2006, 14:03 »
0
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

  • Miembro MUY activo
  • ***
  • Mensajes: 479
    • Ver Perfil
Re: Problemas Con Winsock
« Respuesta #4 en: Martes 14 de Marzo de 2006, 21:07 »
0
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()

...

tiquinho

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re: Problemas Con Winsock
« Respuesta #5 en: Martes 14 de Marzo de 2006, 21:25 »
0
Prueba:
Código: Text
  1.  
  2. Public Sub cmdSend_Click()
  3. Cancelar = False 'Aqui, en el Connect() o en el click del botón de conectar
  4. While (Winsock1.State <> sckConnected Or Cancelar = True)
  5.       Label3.Caption = "Esperando conexión..."
  6.       DoEvents
  7. Wend
  8. If Winsock1.State = sckConnected Then
  9.    Winsock1.SendData txtMensajeEnviar.Text
  10.    Label3.Caption = "Sending Data"
  11. Else
  12.    Label3.Caption = "No se puede conectar a host"
  13. End If
  14. End Sub
  15.  
  16. Public Sub cmdClose_Click()
  17.    cmdConnect.Enabled = True
  18.    cmdSend.Enabled = False
  19.    cmdClose.Enabled = False
  20.    Cancelar = True
  21. End Sub
  22.  
  23.  

Esto esperaría a que estuviese conectado. El problema del tiempo es que puede costarle más conectarse, dependiendo de la red.

Cancelar sería una variable a la que tuvieras acceso desde esas funciones (del módulo, vamos), para que pudieras cancelar en caso de no conectar de verdad.

Espero que te sirva :)

PD: Tampoco estaría de más que le hicieras un Close al winsock al terminar, para asegurarte de que queda cerrado.(Creo recordar que para hacer el Connect tenía q estar cerrado,¿no?)