elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
13 Octubre 2008, 05:27  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General (Moderadores: Hendrix, E0N)
| | |-+  Winsocks: el cliente recibe un archivo mayor del que le envian!!! Por que?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Winsocks: el cliente recibe un archivo mayor del que le envian!!! Por que?  (Leído 567 veces)
prat

Desconectado Desconectado

Mensajes: 45


PrAt


Ver Perfil
Winsocks: el cliente recibe un archivo mayor del que le envian!!! Por que?
« en: 25 Marzo 2005, 03:12 »

Con archivos pequeños no hay ningun problema. Los bytes que recibe el cliente son exactamente los bytes que ocupa el archivo que le envia el server.

El problema viene al pedir archivos grandes(700 ks o mas..). A veces funciona bien y otras recibo un archivo mayor del que fue enviado....y por consiguiente corrupto.


Estas pruebas las hago offline, usando la ip 127.0.0.1 ....asi que no tiene nada que ver la lentitud de la red...

¿Alguien tiene una idea de lo que puedo estar haciendo mal?
En línea

Nota mental: Crearme una firma. >.<
®®
Colaborador

Desconectado Desconectado

Mensajes: 5.270


Ver Perfil
Re: Winsocks: el cliente recibe un archivo mayor del que le envian!!! Por que?
« Respuesta #1 en: 25 Marzo 2005, 06:51 »

quizas el codigo que prrocesa los datos le falla algo.
En línea
alex_primero_1

Desconectado Desconectado

Mensajes: 54


[AMO EL LENGUAJE VISUAL !!!]


Ver Perfil
Re: Winsocks: el cliente recibe un archivo mayor del que le envian!!! Por que?
« Respuesta #2 en: 26 Marzo 2005, 04:47 »

pon tu codigo para que veamos que tiene de malo, algo debe de tener, habriste el archivo en forma binaria??? lo mandas byte por byte o en conjunto ???? he dime
En línea

la vida se encuentra en la penumbra de las sombras ... ULLE DE ELLAS.. que no te atrapen !!
prat

Desconectado Desconectado

Mensajes: 45


PrAt


Ver Perfil
Re: Winsocks: el cliente recibe un archivo mayor del que le envian!!! Por que?
« Respuesta #3 en: 26 Marzo 2005, 05:39 »

Esto es parte del codigo que hay en el evento OnClientRead de mi TServerSocket.(Al que le envian el archivo)

El server es del tipo stNonBlocking.

Código:
if (modo=3) then//Recibir tamaño del archivo
        begin
        avisado:=false;//boolean que indica si se produjo un aviso de error
        tam:=socket_clienteS.socket.connections[0].ReceiveText;
        tamanyo_archivo:=strtoint(tam);//Tamaño en bytes del archivo que vamos a descargar
        recibido:=0;//Bytes recibidos hasta ahora
        modo:=2//Sabemos el tamaño-->pasamos al modo descargar archivo
        end;


if (modo=2) then  //Modo 2=recibir un archivo
begin
  iLen := socket_clienteS.Socket.connections[0].ReceiveLength;//iLen= datos recibidos en esta rafaga
  recibido:=recibido+iLen; //Total bytes recibidos hasta ahora

  GetMem(Bfr, iLen);
  try
    socket_clienteS.Socket.connections[0].ReceiveBuf(Bfr^, iLen);
    F.Write(Bfr^, iLen);
  finally
    FreeMem(Bfr);
  end;


//Aqui iria el codigo para actualizar una TProgressBar


//Si se recibieron mas bytes de los que ocpua el archivo
      if (recibido>tamanyo_archivo) then //Si descarga salio mal
        begin
        if not (avisado)then//Si no se ha avisado ya, avisar del error
                begin
                showmessage('Algo ha salido mal.');
                f.free;
                f:=nil;
                avisado:=true;//Para que solo realice un solo aviso de error
                modo:=0;
                end;
        end
        else

//Si bytes totales recibidos=tamaño en bytes del archivo.
        if(tamanyo_archivo=recibido) then //Descarga correcta
                begin
                    F.Free;//F es el TFileStream que use para almacenar los datos que llegaban
                    f:=nil;
                    modo:=0;//Modo 0 -->A la espera de una nueva orden
                 showmessage('Todo bien. Descarga finalizada con exito');
                end;



 end;//Fin de modo=2


No se....para archivos de hasta 250Ks funciona perfectamente, pero para otros mucho mayores....a veces va bien y a veces no.


El TClientSocket que le envia el archivo, basicamente lo hace de la forma:
Nota:Mi TClientSocket es del tipo ctNonBlocking
Código:

//F es una variable TFileStream: La inicializamos para enviar datos.
//Path es un string con el path del archivo que se va a enviar

F:=TfileStream.Create(path,fmOpenRead or fmShareDenyWrite);

Vserver.socket_serverC.Socket.SendStream(f);//enviar archivo




Supongo que solo con estos fragmentos, poca me puedan ayudar....pero tampoco es plan de colapsar el foro con paginas y paginas de codigo...
En línea

Nota mental: Crearme una firma. >.<
Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.6 | SMF © 2006-2008, Simple Machines LLC