Autor
|
Tema: Pregunta dificil por lo menos para mi =( (Ayuda porfavor) (Leído 1,991 veces)
|
n3ts4mura1
Desconectado
Mensajes: 66
|
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.
|
|
|
En línea
|
|
|
|
Mr.Chispa
Desconectado
Mensajes: 269
|
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.
|
|
|
En línea
|
|
|
|
NYlOn
Desconectado
Mensajes: 842
OOOOHHHHHH, TARAGÜIIII xDDDDDD
|
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.-
|
|
|
En línea
|
|
|
|
MANULOMM
Desconectado
Mensajes: 559
Erepublik.com
|
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.comJUAN MANUEL LOMBANA MEDELLÌN - COLOMBIA
|
|
|
En línea
|
|
|
|
n3ts4mura1
Desconectado
Mensajes: 66
|
Ok manulom gracias.
|
|
|
En línea
|
|
|
|
|
|