Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: ŞCØRPIØN-X3 en 29 Mayo 2011, 04:06 am



Título: Como recibir datos y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 29 Mayo 2011, 04:06 am
Wenas, necesito la ayuda de ustedes..., cree una conexion cliente servidor usando winsock y entre sus opciones una de ellas es que el servidor le brinde al cliente el estado de su CPU cada 1 minuto, el problema que tengo es el siguiente, yo envio el estado del CPU al cliente pero como el cliente es de multiples conexiones, necesito ubicar ese valor en el item del listview que le corresponda (cada item es una conexion con diferentes PC), podrian darme una idea de como hacerlo porfavor?? :)
Espero sus respuestas ;) Gracias de antemano


Título: Re: Como recibir datos(winsock) y ubicarlos segun le corresponda
Publicado por: Edu en 29 Mayo 2011, 04:59 am
Estas haciendo un array de winsock? bueno usa ese index para el listview..


Título: Re: Como recibir datos(winsock) y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 29 Mayo 2011, 22:15 pm
listo ;) muchas gracias lo solucione como me dijiste :) gracias de nuevo  ::) bye

TEMA SOLUCIONADO


Título: Re: [SOLUCIONADO] Como recibir datos y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 29 Mayo 2011, 23:13 pm
Tuveun problema xD, no se soluciono del todo, anda con algunos y con otros no, les explico un poco mejor el procedimiento que ago, cada vez que se conecta un nuevo servidor, se agrega en un ListView y al TAG de ese item se le aplica el index de la conexion del winsock. ahora lo que yo necesitaria hacer es al recibir el use del CPU, buscar en los TAGs del listview el item que tenga el mismo valor del index y a ese modificarle el numero de una columna..., nose si me explico. espero que me puedan ayudar.. :) espero sus respuestas


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: Edu en 29 Mayo 2011, 23:49 pm
Pero no entiendo, si la conexion del winshock(0) pasa al primer item del listview, ya queda todo ordenado, o tu problema es porque el listview se modifica o se ordena de distintas formas segun quiera el usuario?, ahi es agregarle un tag a cada item q eso no cambiara. Y despues usas el numero del tag para el index del winsock(index)


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 30 Mayo 2011, 02:01 am
lo segundo es lo que ago porque si un usuario de la lista se desconecta quedan con distintos index, poreso es que le aplico al tag de cada item el valor del index...


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: Edu en 30 Mayo 2011, 09:10 am
Y entonces ya solucionaste o que?


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 30 Mayo 2011, 19:51 pm
no, todavia no, como ago para referirme a un item que tenga cierto tag, osea, necesito buscar en los TAGs del listview el item que tenga el mismo valor del index y a ese ponerle un texto en la columna 8, el index seria el de la conexion por la que estan llegando esos datos, es decir, si yo mando el texto "Hola" desde un servidor, al llegar al cliente llega con un index, necesito buscar en el listview el item que tenga como TAG el mismo valor del index de la conexion y a ese item poner en la columna 8 la palabra "Hola"(teniendo en cuenta que en el listview hay muchas conexiones, es decir muchas filas con diferentes Tag segun el numero de conexion con cada uno de ellos).


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: Edu en 30 Mayo 2011, 22:39 pm
Deja el codigo asi lo miramos y vemos que talvez se puede hacer de otra forma


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: 79137913 en 30 Mayo 2011, 22:45 pm
HOLA!!!

Mmm, lei todo por arriba, pero no es recomendable usar un control como base de datos, es preferible que uses vectores y luego lo muestres al usuario a traves de un control.

GRACIAS POR LEER!!!


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 31 Mayo 2011, 01:04 am
no, no lo estoy usando como base de datos, Asi funciona mi proyecto:
En el cliente existe un listview en el cual cada vez que se ejecute el servidor en distintas maquinas, se va agregando al listview de forma automatica cada una de las pc y le agrego a ese item del listview el index de la conexion que le corresponde para facilitar el trabajo a la hora de enviar información. En una de las columnas hay una que se llama CPU en la cual tiene que ir el uso del cpu de la PC que le corresponde a ese item del listview. Mi problema esta en como asignarle a cada item del listview el dato entrante que le corresponda. Lo que tengo que buscar es valores iguales ya que a cada item le asigne en el tag el valor del index, entonces lo que tendria que hacer es cuando llegue un dato por el "canal" 3 porejemplo, aplicarle ese dato al item del listview que tenga como tag el numero 3.
Aclaro: el problema solamente esta en la recepcion de la información, la captura del "uso de CPU" ya lo tengo resuelto. Una idea de lo que tendria que hacer es mas o menos lo siguiente:

Código:
Private Sub Winsock1_DataArrival(index As Integer, ByVal BytesTotal As Long)
Winsock1(index).GetData Datos
ListView1.ListItems.Tag(index).SubItems(8) = Datos
end sub

Bueno esa es la idea de como tendria que ser, pero no esta correctamente armada la siguiente linea:

Código:
ListView1.ListItems.Tag(index).SubItems(8) = Datos

Bueno espero que me ayan entendido, perdon por dar tantas vueltas, es un poco complicado hacerse entender en estos casos xD, el codigo entero no lo puedo poner porque es demasiado pero puse basicamente lo que es la recepcion de datos. Muchas gracias por su tiempo espero que me puedan ayudar.. :)


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: Edu en 1 Junio 2011, 01:36 am
A ver.. antes porque te habia funcionado y luego ya no?
Fijate que es lo mismo que cuando haces algo simple como:

Código
  1. Private Sub Form_Load()
  2.  
  3. ListView1.ListItems.Add = "hola"
  4. ListView1.ListItems.Add = "chau"
  5.  
  6. MsgBox ListView1.ListItems.Item(1)
  7. MsgBox ListView1.ListItems.Item(2)
  8.  
  9. End Sub
  10.  

Es decir, cuando vos agregas un item va a quedar en el que sigue lo mismo para el WinSock1 asique no se cual el problema.
Ya que si se crea otro winsock(index), es decir porque hay otra conexion nueva, tu codigo creara otro item mas al listview.

El problema que talvez tienes es porque el listview empieza con 1 como ves en el codigo que te deje, y el Winsock con 0, pero eso se arregla facilmente restando 1.
Cuando seleccionas el item en el listview y haces click en un boton o lo que quieras hacer, para manejar el winsock es winsock(ListView1.SelectedItem.Index - 1)

Talvez no es lo que quieres pero el intento lo hice xD

Edit: cierto que decias que se modifica el orden de los items en el listview, bueno pero ahi entonces si usas lo del tag. Cuando se crea la conexion y vas a agregar un item nuevo como habiamos dicho, le agregas el tag enseguida de crearlo con listview1.listitems.items.tag = num
Y num podria ser una variable que ira aumentando en cada conexion nueva.. no se.


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 1 Junio 2011, 05:52 am
muchas gracias por la respuesta,
Edit: cierto que decias que se modifica el orden de los items en el listview, bueno pero ahi entonces si usas lo del tag. Cuando se crea la conexion y vas a agregar un item nuevo como habiamos dicho, le agregas el tag enseguida de crearlo con listview1.listitems.items.tag = num
Y num podria ser una variable que ira aumentando en cada conexion nueva.. no se.

miira justo esto es lo que te decia antes, esa parte ya la tengo echa pero el problema es como ago para utilizar el valor que le asigne al tag? osea para poner algo asi: al item que tenga como tag el mismo valor que el index del winsock le asigno el dato que llego desde el servidor. Esa es la parte que me falta, creo que ahora lo explique un poco mejor pero nose si me entenderan. Muchas gracias por su tiempo :) espero aver si me pueden ayudar


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: DarkMatrix en 1 Junio 2011, 05:56 am
:S, es tan simple como hacer un bucle a los items del listview comparando el index del Winsock que envio los datos con el tag del listview, si es igual pues modificas la columna que quieres y si no pues seguira el bucle hasta hallar el item que coincida con el tag del listview.


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 1 Junio 2011, 19:23 pm
pero no hay una manera mas sencilla de como hacer para insertar un valor en una columna de un lisview que tenga cierto tag?. Porejemplo que se aplique el valor "2" al item que tenga como tag "Dos"??


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 1 Junio 2011, 21:29 pm
DarkMatrix, lo hice como me dijiste con un bucle aver que tal anda, pero una pregunta, esto tiene alguna consecuencia en el caso de que el listview posea muchos items? bueno cro que no pero quiero lograr la mejor estabilidad posible en mi proyecto xD. Muchas gracias :)


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: BlackZeroX en 2 Junio 2011, 01:22 am
ŞCØRPIØN-X3.

Se te a alentisar demasiado con un simple For Next... digamos que con los primeros 1000 elementos irea rapido pero a medida que se eliminan, agregan etc etc, se alentizara de manera esuberante.

Una pequeña solución es crear una estructura

Código
  1.  
  2. type tlvFind
  3.    lindexSrc as long ' // Indica de donde viene
  4.    lindexDest as long ' // Indica a donde pertece
  5. end type
  6.  
  7.  

Después creando un vector de la estructura y ordenando de menor a mayor o viceversa, el indice respectivo al Item del listview puedes usar la función ItsInArrayNR (http://infrangelux.hostei.com/index.php?option=com_content&view=article&id=28:buscar-en-un-array-veryfast-&catid=2:catprocmanager&Itemid=8) modificandola un poco para que busque de manera rapida en donde ubicar la informacion.

Temibles Lunas!¡.


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: ŞCØRPIØN-X3 en 2 Junio 2011, 04:09 am
Hola BlackZero, gracias por tu respuesta, no entiendo muy bien como aplicar tu codigo :S ese code me supera :/, mira, este es lo que yo codie hoy utilizando un bucle como me habian sugerido anteriormente:

Código:
Private Sub winsock1_DataArrival(index As Integer, ByVal BytesTotal As Long)

         Dim i As Long
         For i = 1 To ListView1.ListItems.Count
         If ListView1.ListItems.Item(i).Tag = index Then
         Listvieww1.ListItems.Item(i).ListSubItems(8).Text = Datos
         End If
         Next


Bueno, "Datos" contiene la informacion que llega por winsock... Espero aver que me sugieres, si con este code me va a servir o si me puedes explicar como seria el uso de tu code BlackZero estaria agradecido :), Muchas gracias por su ayuda :)

Edito: me olvide de mencionar que el tag de cada item tiene el index de su conexion xD


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: BlackZeroX en 2 Junio 2011, 07:29 am
.

Antes queda estas tecnicas que te menciono las he aplicado en mi ListViewEX... a lo mejor te sirva ( ListViewEx 2.0 (http://infrangelux.hostei.com/index.php?option=com_content&view=article&id=26:0listviewex20&catid=13:controlesdeusuario&Itemid=21) ).


Seria mopdificando esta funcion (http://foro.elhacker.net/programacion_visual_basic/src_isinarray-t327065.0.html;msg1621501#msg1621501) para que trabajara con un vector a la estructura del tipo:

Código
  1.  
  2. type stRelacion
  3.    lIndexSock as long
  4.    lIndexListView as long
  5. end type
  6.  
  7.  

en el código de la función (el del enlace) modificas el vaBuff() as long  por vaBuff as stRelacion y en las comparaciones donde aparece vaBuff pones la variable de la estructura stRelacion a buscar de manera rapida.

algo asi:

antes:
Código
  1.  
  2. private function ExitsInArray (byval lvaltofind as long,byref vaBuff() as long,byref lPos as long) as boolean
  3.   '....algo de código
  4.   if lvaltofind= vabuff(indice) then
  5.     '...algo de código
  6.   end if
  7. end function
  8.  
  9.  

lo suplantas por algo similar a esto...

Código
  1.  
  2. type stRelacion
  3.    lIndexSock as long
  4.    lIndexListView as long
  5. end type
  6.  
  7. private function ExitsInArray (byval lvaltofind as long,byref vaBuff() as stRelacion,byref lPos as long) as boolean
  8.   '....algo de código
  9.   if lvaltofind= vabuff(indice).lIndexSock then
  10.     '...algo de código
  11.   end if
  12. end function
  13.  
  14.  

Ahora para hacer o estar creando dicha relación debes llenar cada elemento del vector donde guardaras la relación en IndiceSocket-IndiceFilaListView en el evento donde haces el AceptRequest del Socket.

algo asi:

Código
  1.  
  2. private vaRelacion() as stRelacion
  3.  
  4. private sub algunproceso(byval index as long,... otros parametros del proceso o evento)
  5. Dim lpos as long
  6. Dim lub as long
  7. Dim lIndexRow as long
  8.    '... Antes aceptas la conexion en este mismo proceso
  9.    lIndexRow = '...Agregas un registro mas al listview y obtienes su indice ( propiedad count y le resta 1 para obtener el indice de la fila...) )
  10.    if ( ExitsInArray(index, vaRelacion, lpos) )  'buscamos si ya hay alguna relacion....
  11.        '// Ya hay una relacion pero como dicha relacion no esta en el listview actualmente o esta en desuso... solo la modificamos
  12.        vaRelacion(lpos).lIndexListView = index ' // como ya existia solo le actualisamos el registro al listview...
  13.    else
  14.        ' // si no existe redimensionamos vaRelacion
  15.        if (itsarrayini(varptrarr(vaRelacion))=true) then
  16.            lub = ubound(vaRelacion)+1
  17.            redim preserve vaRelacion (lbound(vaRelacion) to lub)
  18.            vaRelacion(lub).lIndexSock = index
  19.            vaRelacion(lub).lIndexListView = lIndexRow
  20.        end if
  21.    end if
  22. end sub
  23.  
  24.  

Con eso se llena... ahora que si quieres quitar dicha relacion. solo seria modificando esta funcion de la misma manera:

Código
  1.  
  2. Private Function privRowDelete(ByRef vRowIndex As Long) As Boolean
  3. Dim ln_Bytes                                As Long
  4. Dim lng_PtrOld()                            As Byte
  5.    With PCVars.Rows
  6.        If .Count > 0 Then
  7.            ln_Bytes = LenB(.Row(0))
  8.            .Count = .Count - 1
  9.            If .Count > 0 And vRowIndex > InvalidValueArray Then
  10.                If ln_Bytes > 0 And vRowIndex + 1 <= .Count Then
  11.                    ReDim lng_PtrOld(1 To ln_Bytes)
  12.                    Call CopyMemory(ByVal VarPtr(lng_PtrOld(1)), ByVal VarPtr(.Row(vRowIndex)), ln_Bytes)
  13.                    Call CopyMemory(ByVal VarPtr(.Row(vRowIndex)), ByVal VarPtr(.Row(vRowIndex + 1)), ln_Bytes * (.Count - vRowIndex))
  14.                    Call CopyMemory(ByVal VarPtr(.Row(.Count)), ByVal VarPtr(lng_PtrOld(1)), ln_Bytes)
  15.                End If
  16.                ReDim Preserve .Row(0 To .Count - 1)
  17.            Else
  18.                Erase .Row()
  19.            End If
  20.            privRowDelete = True
  21.        End If
  22.    End With
  23.  
  24. End Function
  25.  
  26.  

Código:

para que entiendas esta funcion has de cuenta que un array vector o matrix es una sucesion de valores uno atras de otro o uno delante de otro como la numeros:

0123456789

Ok bien el trabajo de copymemory es copiar bloques de ellos a otras partes es decir digamos que tenemos esto en la memoria...

aaaabbbbccccddddeeeeffff

ok? en la memoria un puntero es de 4 bytes (en arquitecturas de 32 bits vb es de 32 bits), bien lo que se hace es que la dirrecion fisica de un puntero indica donde esta algo lo que sea...

ahora par LenB() obtiene el peso en bytes de un indice de un elemento de un array o vector... despues se multiplica por la cantidad de elementos a deszplazar.. digamos ahora si:

aaaabbbbccccddddeeeeffff

Como vez puse de alguna manera 4 a, 4 b 4c etc... por que digamos que son punteros ( 4 bytes = long = puntero ) funcion VarptrArr().

Cada 4 bytes = 1 elemento del indice de un vector/array por lo tanto lenb(vaRelacion(indice)) = 4 u 8 bytes ( puede variar aun que si hay punteros o declaracion de strings o mas arrays no inicializado dentro de la estructura es comun que sean 4 bytes de lo contrario en este caso como son todos long te dara 8 bytes cada elemento de vaRelacion(indice)... )

Ok llendo al grano de esto lenb(vaRealacion(indice)) = 8 por lo tanto de:

aaaabbbbccccddddeeeeffff

"aaaabbbb" se decuce que que como esta la estructura en la 1ra variable es lIndexSock las "aaaa" indican este valor y las "bbbb" indicaran lIndexListView el trabajo del codigo es que si quieres remover por ejemplo el indice 1 de vaRelacion ( es decir "ccccdddd" ) se hace esto:

Se hace un backup de "ccccdddd" en un array de Bytes(0 to (lenb(vaRelacion(indice))-1)) o bien (0 to 7) como ya habíamos analisado...

lng_PtrOld = {"ccccdddd"} ' 1er copymemory

se mueve el bloque hacia la izquierda....

aaaabbbbeeeeffffeeeefffff ' 2do copymemory

como vez ahora se repitieron "eeeeffff" pero como somos organisados y queremos que nuestro proceso sea maleable y adaptable para otros aspectos que quisas nos sirvan en un futuro hacemos que lo guardado en el array de bytes (en este caso lng_PtrOld) lo mandamos al final...
Hacemos un 3er copymemory para mandar lo resguardado al final quedando

quedando:

aaaabbbbeeeeffffccccdddd ' // 3er copymemory

al final aplicamos un redim preserve para eliminar ahora si el ultimo indice y quedaria haci...

aaaabbbbeeeeffff

De esta manera se eliminara un elemento de un array/vector cualquiera de manera veloz es la mas veloz que existe en vb6

en si solo se nesesitaria 1 copymoemy para este caso pero quise explicarte el por que de 3 copymemory... ya que si es otra estructura puede que cada indice el puntero sea un puntero al bloque de memoria donde se encuentren las variables pero como no es el caso puedes usar 1 copymemory libremente...


Temibles Lunas!¡.
.


Título: Re: Como recibir datos y ubicarlos segun le corresponda
Publicado por: DarkMatrix en 2 Junio 2011, 07:33 am
Si tu proyecto no va a tener muchos clientes conectados ps el for te sirve, de lo contrario aplica lo que dice BlackZero, yo lo haria mas o menos asi:

Declaro una variable global:

Código
  1. Dim LvwSockIndex(100) as Long

Cuando un cliente se conecte uso su index para almacenar la posicion que ocupa en el listview, asi no tendria que almacenar el valor del sock en el tag del listview:

Ejemplo ( esto iria donde agregas el cliente al listview ) :

Código
  1. Dim sItem as Listitem
  2.  
  3. Set sItem = Listview1.listitems.add (,, Index) ' Agrego el cliente al listview
  4. sItem.Subitem(1) = "Cliente" ' Agrego algunos sub valores
  5.  
  6. ' Luego Almaceno la posicion que ocupa en el listview en el indice de la matrix igual al indice del sock del cliente:
  7.  
  8. LvwSockIndex(Index) = Sitem.Index

Asi cuando el cliente mande un dato, solo tendrias que hacer esto:

Código
  1. Private Sub winsock1_DataArrival(index As Integer, ByVal BytesTotal As Long)
  2.  
  3.         Listvieww1.ListItems.Item(LvwSockIndex(Index)).ListSubItems(8).Text = Datos
  4.  
  5. end sub

Espero que se entienda mas o menos la idea...