Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: skyline2412 en 7 Octubre 2008, 23:52 pm



Título: Envio de archivos con CSocketPlus
Publicado por: skyline2412 en 7 Octubre 2008, 23:52 pm
Saludos,
Bueno en estas ultimas semanas vengo programando un projectito de vb6 que incluye un filemanager ( ya saben..lo tipico listar ejecutar subir descargar..)
Primero empece con el winsock, y bueno entre la dependencia del ocx y el 'memory leak' que te obliga a usar DoEvents, pues me decidi a cambiarlo por CSocketMaster, y este ultimo lo cambie en ultima instancia por CSocketPlus, ya que queria poder crear varias conexiones, un canal para la comunicacion simple, y otro para la transferencia de ficheros (al estilo que funcionan los programas ftp)

pero claro estoy teniendo algunos inconvenientes a la hora de la transferencia del archivo, la forma en que lo envio en si funciona,
pero los 2 problemas son que durante la transferencia la CPU se pone al 100%
y la RAM sube un total de la memoria que ocupa la aplicacion + el espacio de la aplicacion cargada en memoria.
Bueno esto ultimo lo solucione con un "ERASE buffer" obviamente para limpiar todo lo que cargo en memoria del file.
Pero en cuanto a lo de la carga del CPU tengo bastantes dudas.

Supongo que lo que deberia de hacer es partir el buffer en X bytes y montar un bucle cierto?
Si es asi calculo que lo mejor seria leer X longitud de bytes del archivo, ademas asi evito que se cargue todo el tamaño del file en memoria, renovando los bytes a cada vuelta.

Asi es como lo hago actualmente para que se hagan una idea.


Private Sub WS_DataArrival(ByVal Index As Variant, ByVal bytesTotal As Long)
 ·
 ·
 ·
// Recibiriamos la cadena "bajar|archivo"
on case "bajar"
   indice = indice + 1
   canal_envio = indice

   filename = Dir1.path & "\" & data(1)
   ws.ArrayAdd canal_envio

   // Leemos el file
   ReDim buffer_file(FileLen(filename) - 1)
   Open filename For Binary As 1
   Get #1, 1, buffer_file
   Close #1
   ws.CloseSck canal_envio
   ws.Connect canal_envio, ws.RemoteHostIP(Index), ws.RemotePort(Index)

Private Sub ws_Connect(ByVal Index As Variant)
   If Index = canal_envio Then
      ws.SendData Index, "comienzo|" & filename
      ws.SendData Index, buffer_file
      sent = True
      Erase buffer_file
   End If
End Sub

Private Sub ws_SendComplete(ByVal Index As Variant)
  If Index = canal_envio And sent = True Then
    ws.CloseSck (canal_envio)
    canal_envio = -1
    sent = False
  End If
End Sub

Bueno este metodo tiene el principal inconveniente (aparte de los ya comentados anteriormente) de que solo admite una transferencia y si kieres descargar otro tendras q esperar a q acabe el primero una verdadera mamonada precisamente porque implemente CSocketPlus para poder realizar transferencias simultaneas..
Bueno espero me puedan ayudar, mediante consejos esquemas y demas para lograr todo esto, ya saben.. reducir el uso de la CPU e implementar una funcion de descarga en condiciones ya que llevo atascado aqui un par de semanas ya..

Gracias.