Programación General > Visual Basic 6.0 e inferiores
Problemas Con Winsock
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
[#] Página Siguiente
Ir a la versión completa