Pregunta dificil por lo menos para mi =( (Ayuda porfavor)

Iniciado por n3ts4mura1, 21 Agosto 2006, 17:35 PM

0 Miembros y 1 Visitante están viendo este tema.

n3ts4mura1

Sacado de un libro voy a escribir lo que este dice luego escribo mi cofigo que me falla:
************************************************************ ***********
Dice:
****
El codigo que se muestra a continuacion presupone que existe un control Winsock en un formulario llamador sckServer y que su propiedad Index tiene el valor 0,por lo que el control forma parte de una matriz de controles.En la seleccion Declaraciones se declara una variable intMax a nivel de modulo.En el evento Load del formulario,intMax tiene establecido el valor 0 y la propiedad LocalPort del primer control de la matriz el valor 1001.Despues,se invoca el metodo Listen en el control,convirtiendolo en el control "que escucha".A medida que llega cada solicitud de conexion,el codigo comprueba si el indice es 0 (el valor del control "que escucha"). Si es asi,este control aumenta la variable intMax y utiliza ese numero para crear una nueva instancia del control.Esta nueva instancia se utiliza para aceptar una solicitud de conexion.

Ahora el codigo que sale en el libro es:
*****************************************
Private intMax As Long

Private Sub Form_load()
        intMax=0
        sckServer(0).LocalPort=1001
        sckServer(0).Listen
End Sub

Private Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
        If Index=0 Then
           intMax=intMax+1
           Load sckServer(intMax)
           sckServer(intMax).LocalPort=0
           sckServer(intMax).Accept requestID
           Load txtData(intMax)
        End If
End Sub

**********************************

Ahora mi codigo:
***************

Servidor: Un control winsock con nombre sckServer 2 cajas de texto y un boton para enviar el texto.

*****************************
Private intMax As Long

Private Sub Command1_Click()
Dim enviar As String
enviar = Text2.Text
sckServer(Index).SendData enviar
End Sub

Private Sub Form_Load()
    intMax = 0
    sckServer(0).LocalPort = 1001
    sckServer(0).Listen
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    If Index = 0 Then
        intMax = intMax + 1
        Load sckServer(intMax)
        sckServer(intMax).LocalPort = 0
        sckServer(intMax).Accept requestID
        Load txtdata(intMax)
    End If
End Sub

Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim datos As String
sckServer(Index).GetData datos 'aca nose si es intmax o index
Text1.Text = Text1.Text + datos
End Sub

***************************************
Cliente:un control winsock se llama sckCliente 2 cajas de texto 2 botones uno para enviar y otro boton para conectar.


Private Sub Command1_Click()
sckCliente.RemotePort = 1001
sckCliente.RemoteHost = "192.168.0.1"
sckCliente.Connect
End Sub

Private Sub Command2_Click()
Dim enviar As String
enviar = Text2.Text
sckCliente.SendData enviar
End Sub

Private Sub sckCliente_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
sckCliente.GetData datos
Text1.Text = Text1.Text + datos
End Sub

******************************************


me fallan tanto el cliente como el servidor al tratar de enviar el mensaje de un lado al otro pero se conectan .

Agradeceria mucho alguien me diera una mano desde yan muchas gracias saludos a todos xD.

Mr.Chispa

no se q es lo q intentas hacer.
si te sirve de ayuda el codigo para conectar es asi:
SERVIDOR:
en evento loadform:
winsock.localport=5000
winsock.listen
en evento connectionrequest:
winsock.close
winsock.accept requestId
CLIENTE:
en evento loadform
winsock.remotehost="xxx.xxx.xxx.xxx"
winsock.remoteport=5000
winsock.close
winsock.connect

a mi me funciona.

NYlOn

1º: Si vas a meter codigo usa las etiquetas correspondientes

2º: sckServer(Index).SendData enviar
Ahi no estas indicando el Index. Intenta poniendo intMax.

3º: En el ConnectionRequest antes de aceptar creas un socket nuevo y aceptas la conexion con ese (el que acabas de crear). No se que Index utiliza el socket en el DataArrival, pero te recomiendo cambiarlo a intMax, asi usa el ultimo de todos.

Fijate a ver si funciona con esos cambios. Saludos.-

MANULOMM

hola
yo estoy en proceso de hacer un aplicacion parecida y me di cuenta que tratas de hacer una multiconexion (Vario Clientes un Solo Servidor) pero como no sabemos cuantos clientes son  entonces le pedimos a la aplicacion que por cada cliente cree un winsok para la conexion por lo cual debe haber 2 winsock el 1 escucha este no tiene matriz (Array) pero el 2 como es quien hace la conexion con el nuevo cliente si debe tener Matriz y que esta este en 0, un pequeño desajuste de esto es que si se crea un Winsok y un cliente se conecta y mastarde se desconecta el winsock creado no desaparece por lo cual hay que decirle a la aplicación que antes de crear un nuevo winsock revise si no hay uno desocupado por que nos llenariamos de winsock, a qui te pongo mi coldigo que cumple con todo esto (Esta un poco distinto en cuanto a variables y txt pero esta muy comentado para que lo entiendas con facilidad)


'****ESTE ES EL CLIENTE***
Private Sub Command2_Click() 'Boton Conectar
'asignamos los datos de conexion
Winsock1.RemoteHost = Text3.Text  'Ip Servidor
Winsock1.RemotePort = Text4.Text  'Puerto
'conectamos el socket
Winsock1.Close
Winsock1.Connect
End Sub
Private Sub Winsock1_Connect()
'desplegamos un mensaje en la ventana
Text1.Text = Text1.Text & "*** Conexion establecida." &  VBCrLf
'desplazamos el scroll
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Winsock1_Close()
'cierra la conexion
Winsock1.Close
'desplegamos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "*** Conexion cerrada por el servidor." & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Command3_Click() 'Boton Desconectar
'cierra la conexion
Winsock1.Close
'desplegamos un mensaje en la ventana
Text1.Text = Text1.Text & "*** Conexion cerrada por el usuario." & vbCrLf
'desplazamos el scroll
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Command1_Click()
'enviamos el contenido de Text2
Winsock1.SendData Text2.Text & vbCrLf
'apuntamos al final del contenido del TextBox e
'insertamos los nuevos datos obtenidos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
Text1.Text = Text1.Text & "Cliente >" & Text2.Text & vbCrLf 'mostramos los datos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
'borramos Text2
Text2.Text = ""
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Buffer As String 'variable para guardar los datos
'obtenemos los datos y los guardamos en una variable
Winsock1.GetData Buffer
'apuntamos al final del contenido del TextBox e
'insertamos los nuevos datos obtenidos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
Text1.Text = Text1.Text & "Servidor >" & Buffer 'mostramos los datos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
End Sub
Private Sub Winsock1_Error(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)
'cerramos la conexion
Winsock1.Close
'mostramos informacion sobre el error
MsgBox "Error numero " & Number & ": " & Description, vbCritical
End Sub

Hasta Aca Esta el Cliente es muy Completo
CODIGO SERVIDOR

Private Sub Command1_Click()
Dim numElementos As Integer 'numero de sockets
Dim i As Integer 'contador
i = text4.text 'Comunicarme Con Un Cliente en Especial Por medio del Index del Sock
'obtiene la cantidad de Winsocks que tenemos
numElementos = Winsock2.UBound
'si el socket se encuentra conectado...
If Winsock2(i).State = sckConnected Then
'enviamos el contenido de Text2
Winsock2(i).SendData Text2.Text & vbCrLf
'apuntamos al final del contenido del TextBox e
'insertamos los nuevos datos obtenidos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
Text1.Text = Text1.Text & "Sock" & i & ":Servidor >" & Text2.Text & vbCrLf 'mostramos los datos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
End If
'borramos Text2
Text2.Text = ""
End Sub
Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim Buffer As String 'variable para guardar los datos
'obtenemos los datos y los guardamos en una variable
Winsock2(Index).GetData Buffer
'apuntamos al final del contenido del TextBox e
'insertamos los nuevos datos obtenidos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
Text1.Text = Text1.Text & "Sock" & Index & ":Cliente >" & Buffer 'mostramos los datos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
End Sub
Private Sub Winsock2_Close(Index As Integer)
'cierra la conexion
Winsock2(Index).Close
'desplegamos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "Sock" & Index & ":*** Conexion cerrada por el Cliente." & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Winsock2_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)
'cerramos la conexion
Winsock2(Index).Close
'mostramos informacion sobre el error
MsgBox "Error numero " & Number & ": " & Description, vbCritical
End Sub
'Carga un nuevo socket al arreglo y devuelve su indice
Private Function NuevoSocket() As Integer
Dim numElementos As Integer 'numero de sockets
Dim i As Integer 'contador
'obtiene la cantidad de Winsocks que tenemos
numElementos = Winsock2.UBound
'recorre el arreglo de sockets
For i = 0 To numElementos
'si algun socket ya creado esta inactivo
'utiliza este mismo para la nueva conexion
If Winsock2(i).State = sckClosed Then
NuevoSocket = i 'retorna el indice
Exit Function 'abandona la funcion
End If
Next
'si no encuentra sockets inactivos
'crea uno nuevo y devuelve su identidad
Load Winsock2(numElementos + 1) 'carga un nuevo socket al arreglo
'devuelve el nuevo indice
NuevoSocket = Winsock2.UBound
End Function
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Dim numSocket As Integer 'el numero del socket
'mostramos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "*** Peticion numero " & requestID & vbCrLf
Text1.SelStart = Len(Text1.Text)
'creamos un nuevo socket
numSocket = NuevoSocket
'aceptamos la conexion con el nuevo socket
Winsock2(numSocket).Accept requestID
'desplegamos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "Sock" & numSocket & ":*** Conexion aceptada, listo para interactuar." & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub

Listo este es el Servidor Espero que te haya servido este codigo cualquier cosa me lo comentas al correo:
manulom@gmail.com

JUAN MANUEL LOMBANA
MEDELLÌN - COLOMBIA