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. |