Título: Duda cliente-servidor, multiples conexiones, administrador de conexiones Publicado por: -Xenon- en 10 Enero 2006, 20:19 pm no sabia como poner el titulo, espero que almenos sea orientativo para este problema que tengo, el problema es que me he quedado atascado, estaba haciendo esto: tenemos una aplicacion servidor, la cual quiere conectar por el puerto 69 a un cliente, para que el clente soporte varias conexiones por ese unico puerto, hay que hacer algun sistema, y entonces el programa con el que tengo dudas hace esto: escucha y acepta conexiones por el puerto 69, una vez establecida una conexion, pone a escuchar otro puesto "6800", mandando al servidor conectar por ese nuevo puerto, una vez establecida esta segunda conexion, cierra el puerto 69 y lo deja otra vez ala escucha para otra conexion, cuando otro servidor conecta por el puerto 69, repite el proceso anterior, pero sumando 1 al puerto 6800, asi cada vez que se repite el proceso se van conectando realmente asi con el programa: servidor---------6800-programa servidor---------6801-programa servidor---------6802-programa servidor---------6803-programa servidor---------6804-programa etc... hasta aqui perfecto, ala vez que se van estableciendo estas conexiones por orden, tambien se muestra graficamente en un listview, de esta manera: N | nombre | ip | ping | ------------------------------------------------------ 1 | fulanito | 127.0.0.1 | 235 | ------------------------------------------------------ 2 | xenon | 192.168.0.1 | 246 | ------------------------------------------------------ 3 | pepito | 192.168.0.2 | 127 | ------------------------------------------------------ 4 | lol | 192.168.1.5 | 169 | ------------------------------------------------------- perimero, el primer elemento de la lista es un numero que quiere decir el orden segun fueron conectandose, es igual a el puerto 6800 + item de la columna, osea la conexion 3, de pepito, usaria el puerto 6803 , ok? hasta aqui todo perfecto, ahora viene cuando la matan ( pongo tantos pelos y señales, para queme podais dar una ayuda mejor ) bueno, el tema a conseguir es este: quiero que ahora, al pinchar en el grafico con el numero, el nombre y eso, que cuando pinche en el numero de alguno, este se conecte a un cliente, todo bien, al pinchar por ejemplo en 3(pepito) manda al cliente escuchar por el puerto "6903"( 100 mas que 6803 ) y manda a su vez al servidor que se conecte a ese puerto, una vez hecho esto, en el listview se sigue viendo como que esta conectado! entonces puese que despues de conectar con el cliente, borrara esa linea quedando asi: N | nombre | ip | ping | ------------------------------------------------------ 1 | fulanito | 127.0.0.1 | 235 | ------------------------------------------------------ 2 | xenon | 192.168.0.1 | 246 | ------------------------------------------------------ 4 | lol | 192.168.1.5 | 169 | ------------------------------------------------------- ahora queda mal! feo, el 4 deberia ser 3, pues puse que se pusieran ordenados 1,2,3, en vez de 1,2,4, con lo cual se jode el invento, ya que para saber que numero de puerto ay que usar, lo identifico con el ITEM, el numero que aparece en el listview, asi ahora el 4(lol) que ahora es 3(lol) usaria el 6904 y no el 6903, con lo cual no se arreglarlo entonces pensareis, pues dejalo asi que tampoco queda tan mal!! pero TAMPOCO PUEDO, por que si ahora pincho en el 4(lol) tiene como INDEX "3" y para borrar esa linea se usa el INDEX de el listview ( se me entiende? ) los elementos cogen un index, que es igual a su posicion en el listview, si borro uno, lo que hago es coger como dato el numero que le pongo para identificarlo yo, por que es el mismo que el index, pero el programa solo sabe identificar cada linea por su index, asi cada linea tenia su index IGUAL a su numero de identificacion, escepto si borro una linea Y NO LA ORDENO! fijaos ahora lo importante que me era ordenar el numero de identificacion despues de borrar uno!! para que tengan el mismo index y poder seguir borrando el que yo quiera cuando quiera!! la putada esque no puedo tener las 2 cosas! poder borrar alguna linea y conectarme a alguna linea ejemplo: si borro la 3, se queda como vimos arriba, 1 , 2 , 4 ahora si quiero conectarme al 4, lo tengo facil por que uso su numero de identificacion para saber que ese esta pillado por el 6804 y debera conectar al 6904, pero ahora no puedo borrar el 4 si pincho en el, conectaria, pero no podria borrarlo, por que solo habria 3 elementos con index 1, 2 y 3, y si le digo que borre 4, la unica forma que tengo de saber que el 4 es el 4, es por su numero que le pongo de identificacion, con lo cual quedaria asi: quita la linea (item) 'item es igual al valor de la linea, en este caso 4, y ahora como el parametro de entreparentesis queme pide es el index, le doy el 4, y me dice obviamente, que el index esta fuera del rango, pero yo no se como coño hacer para que sepa que el 4 tiene de index 3, o que al reordenar todo, el index esta bien, pero entonces como coño hago paque sepa que no conecte al 6903 si no al 6904 HE AQUI LA DUDA!!! 69 ------- (programa) 6801 ------cliente----- 6901 69 ------- (programa) 6802 ------cliente----- 6902 69 ------- (programa) 6803 ------cliente----- 6903 69 ------- (programa) 6804 ------cliente----- 6904 se entiende? ya se que es un lio tremendo y que me enrrollo muchisimo, pero para que se me pueda ayudar, tenia que esplicarlo todo bien, y ahora os pongo el codigo para que lo veais mejor!! PROGRAMA QUE ADMINISTRA Código: Dim Index As Integer SERVIDOR Código: Dim archivo As String, por As String, cion As Long, copon As Long CLIENTE Código: el cliente es solo un programa que escucha por el puerto que le digas y acepta la conexion muchas gracias, si te as leido toda esta parrafada, solo para ver si podrias ayudarme, pues ese gesto ya te lo agradezco mucho, tienes mas paciencia que un santo!!, y si encima puedes ayudarme en este rompecabezas, aun te lo agradecere mas :) Un Saludo!!! Título: Re: Duda cliente-servidor, multiples conexiones, administrador de conexiones Publicado por: EstoyBaneado en 10 Enero 2006, 20:55 pm yo si te he entendido, y si te puedo ayudar. pero yo, al igual que tu, quizas no me exprese bien ;) asi que tengo tu solucion a ver si la entiendes.
Primero: lo de la conexion esa que haces, no sirve. bajate esto Clase para emular el MSWINSOCK (CSocketPlus)(Solo para el cliente): http://www.geocities.com/anshoku/ y trata de aprenderlo a usar. ejemplo: http://foro.elhacker.net/index.php/topic,103130.msg479034.html#msg479034 la explicacion: El CsocketPlus permite usar un array de sockets. esto te servira, porque tendras solo un puerto abierto (no necesitas abrir lo demas y todo eso que haces, que es muy creativo pero poco practico). entonces, lo usarias de esa manera: Private Sub cs_ConnectionRequest(ByVal Index As Variant, ByVal requestID As Long) cs.ArrayAdd cs.RemoteHostIP("ini") cs.Accept cs.RemoteHostIP("ini"), requestID IndexServ = cs.RemoteHostIP("ini") End Sub Como ves, cs.ArrayAdd agrega una conexion al array. luego, cuando quieras usarla debes especificar a que conexion te refieres. por ejemplo: cs.Sendata "192.168.0.1", "holaaaaaaaaaaaaaa" ¿comprendez? ahora, agregando como key la IP no necesitas eso del index del lisview. solo debes usar la IP que tiene el listview. entendes? si no entendiste vuelve a postear que te lo explico mejor. la variable string IndexServ la uso para no tener que llamar al lisview a cada rato. Salu2. Título: Re: Duda cliente-servidor, multiples conexiones, administrador de conexiones Publicado por: -Xenon- en 10 Enero 2006, 21:32 pm pues la verdad es que no lo entiendo... te comento el csocketplus, supongo emula varios mswinsck, pero eso no es el problema que tengo, el problema es borrar una linea del listview, y el otro como saber a que puerto conectar usando el listview, es mas duda sobre el manejo del listview y una programacion eficiente, o tener una mente brillante, ya que con los elementos basicos que suelo usar, "creo" que puedo hacer casi cualquier cosa, lo unico es saber la manera de combinarlos...
el segundo link que me as dejado, pones que se necesita un nivel medio-avanzado, pues te esplico, yo tengo nivel basico, no, muy basico ;D, fijate que para un bucle no uso for next, ni do while, si no GOTO jeje, etiquetas y saltos condicionales, alo asm, poco profesional? seguramente, pero repito mi nivel es MUY BASICO, asi que no entiendo bien ese tutorial, ni se como me puede ayudar pero gracias igualmente por intentarlo :) PD: espera, no ley la modificacion con la esplicacion que as puesto, ahora lo leo despues de cenar y haber que tal, GRACIAS Título: Re: Duda cliente-servidor, multiples conexiones, administrador de conexiones Publicado por: EstoyBaneado en 10 Enero 2006, 21:55 pm es que mi hermanito me quito la pc, y no pude terminar de postear por eso lo deje por la mitad.
ok ok, explicare mejor esta vez. este es mi form_load: Código: Private Sub Form_Load() como vez, creo una conexion llamada "ini", abriendo el puerto 81 en mi propia PC (solo por motivos de prueba) ahora bien, cuando alguien se conecte a esta IP, al puerto 81 se tirara el siguiente evento: cs_ConnectionRequest Código: Private Sub cs_ConnectionRequest(ByVal Index As Variant, ByVal requestID As Long) fijate bien. agregue una nueva conexion (cs.ArrayAdd) llamada..... como se llama la nueva conexion? : cs.RemoteHostIP("ini") <---- devuelve la IP remota. osea, si nos conectamos desde nuestra misma ip sera "127.0.0.1" asi se llamara esa conexion y asi la identificaremos de las demas. Como vez, no pueden haber mas de 2 conexiones con el mismo nombre. ahora, esa nueva conexion la usaremos para aceptar al peticion de conexion que recibimos de "ini". si "ini" no conecto... seguira a la escucha. entonces, el puerto 81 seguira abierto, ya que "ini" solo hace de puente. ¿comprendez mendez? ahora bien, en el siguiente post te explico lo del listview, que tengo que abrir el compilador. Título: Re: Duda cliente-servidor, multiples conexiones, administrador de conexiones Publicado por: EstoyBaneado en 10 Enero 2006, 22:07 pm ahora, con el listview es facil porque la columna que tiene la IP al mismo tiempo tiene la identificacion de la conexion. es mas. te recomiendo esto:
en la parete que agregas el item: With Me.ListView1.ListItems.Add(, , i) agregues como Key la IP remota. osea que: Código: Private Sub cs_ConnectionRequest(ByVal Index As Variant, ByVal requestID As Long) y luego... Código: Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem) ya man. ahora que veo mejor tu code, es que me doy cuenta de que creas la conexion, osea un nuevo Ws en el dataarrival, osea cuando ya esta conectado. puedes hacer lo mismo pero en el cs_ConnectionRequest antes de conectar. ¿comprendes mendez? si no entiendes, pregunta de nuevo. Título: Re: Duda cliente-servidor, multiples conexiones, administrador de conexiones Publicado por: -Xenon- en 10 Enero 2006, 22:28 pm 1 - mil gracias por tu paciencia y ayuda! 2 - creo que lo entiendo, voy a ponerme a tabajar en ello haciendo las modificaciones que haga falta como dices, y comprobare que todo va bien, 3 - posteare el codigo bueno por si a alguien le sirve Título: Re: Duda cliente-servidor, multiples conexiones, administrador de conexiones Publicado por: Kizar en 11 Enero 2006, 19:23 pm Ya k me lo an pedido aki una pekeña donacion de mi codigo fuente de mi troyano.
Esto lo k ace es aceptar muchas conexiones por un mismo puerto y te permite mandar cosas a cada conectado por separado. Código: 'PROGRAMADO POR KIZAR Enjoy it!!! ;) Salu2 Título: Re: Duda cliente-servidor, multiples conexiones, administrador de conexiones Publicado por: Ismy en 14 Enero 2006, 14:07 pm El codigo de Kizar me ha servido.
Ahora me surgen dudas 1.Que haré cuando quiera dejar de tener el MSWINSCK.ocx , porque con el CSocketPlus no me sale 2. Cuando cierro el server el cliente sigue mostrando la conexión, como puedo hacer para que cuando se desconecte desaparezca del listview Título: Re: Duda cliente-servidor, multiples conexiones, administrador de conexiones Publicado por: -Xenon- en 14 Enero 2006, 14:44 pm Código: ListView1.ListItems.remove (lol) ' donde lol contiene el index de la linea a borrar y lo pones en el evento close del socket que usaba esa conexion.. por cierto, vuestras respuestas son muy utiles y eficientes, pero tengo la duda de como se arreglaria mi problema usando solo mi codigo, sin usar csocketplus, y sin usar tu metodo kizar, usando mi codigo, pero que es lo que hay que hacer para resolverlo, eso es lo que me desquicia, no poder hallar la solucion al problema, mas que el hecho de que funcione! es la pura curiosidad para aprender mas, es como si eso fuera un juego, y me he quedado atascado en esa fase, me gustaria saber como pasar de nivel, ya que yo por mas que lo intento pensar, no se resolverlo, es como un puñetero acertijo! estoy hablando de mi codigo, usando mi sistema y etc... alguna sugerencia? de todas formas os agradezco mucho lo ya aportado! :) yo estaba pensando como bien dijo nml, en asociar cada ip con el index, pero no se como, por ejemplo se resolveria si la ip pudiera ser una variable en la me almacenara el puerto de conexion, asi llamando ala ip del listview, estaria ya sabiendo el puerto.. pero eso no puede hacerse asi.. alguna idea? |