none
Problema al descargar por socket y descomprimir un zip RRS feed

  • Pregunta

  • Como es habitual en estos casos, acudo a vosotr@s para que me echéis un cable (o me arrojéis algo de luz) con un problema que estoy teniendo desde hace un par de días.
     
    Os explico, tengo una aplicación hecha con VS 2005 para una PDA en .NET con el CF 2.0. En la aplicación en cuestión hay una clase que se encarga de los procesos de compresión y descompresión de ficheros.
     
    En la aplicación se accede por GPRS a un servidor del cual descargamos unos ficheros zip necesarios para la aplicación. La cuestión es que todo ha estado funcionando bien hasta hace un par de días, cuando me percaté de que las PDA descargaban el fichero zip correctamente pero no eran capaces de descomprimirlo. Después de depurar el proceso vi que al descomprimir uno de los ficheros que hay en el zip, nos devolvía un error (size mismatch). Cuando comparé el fichero (zip) que había descargado la PDA con el fichero (zip) que había en el servidor, me di cuenta de que el fichero (dat) que había dado el error al descomprimir había sido modificado por la propia PDA introduciendo unas veces mensajes de "errores" y en otras ocasiones porciones del código de la aplicación (¿¿¿???).
     
    Lo más desconcertante de todo es que el error se produce de una manera aleatoria, ya que no se produce siempre que hay una descarga de ficheros, ni siempre en la misma PDA, ni siempre con el mismo fichero descargado del servidor. Es decir, no soy capaces de encontrar un patrón para reproducir el error.
     
    ¿Alguno de vosotros se ha encontrado alguna vez con algo similar? Agradecería muchísimo algún tipo de orientación porque cada vez estoy más desconcertado al respecto.
     
    Muchas gracias a tod@s!!
    • Editado mapeher martes, 3 de noviembre de 2009 19:26 Cambio el titulo para que se ajuste mejor a lo que pasa
    jueves, 29 de octubre de 2009 18:58

Respuestas

  • Hola:

    A mi me ocurrió algo similar y no podria reproducirlo, y no fue por más que unas comillas fuera de su sitio, claro que la descarga la hacia por sockets y el problema era que no limpiaba el buffer antes de recoger los nuevos datos y guardarlos al fichero, por lo que corres el riesgo de que este lleno de "basura", y encima no puedes replicar el error porque depende de que coincida que el espacio de memoria que se pilla para crear el buffer no este limpio....

    ¿Qué método utilizas para descargar los archivos?
    viernes, 30 de octubre de 2009 7:31

Todas las respuestas

  • Hola:

    A mi me ocurrió algo similar y no podria reproducirlo, y no fue por más que unas comillas fuera de su sitio, claro que la descarga la hacia por sockets y el problema era que no limpiaba el buffer antes de recoger los nuevos datos y guardarlos al fichero, por lo que corres el riesgo de que este lleno de "basura", y encima no puedes replicar el error porque depende de que coincida que el espacio de memoria que se pilla para crear el buffer no este limpio....

    ¿Qué método utilizas para descargar los archivos?
    viernes, 30 de octubre de 2009 7:31
  • Hola, gracias por responder!!

    En un principio pensé que el problema era al procesar el fichero en la pda, pero después de marcarlo a "solo lectura" y ver que seguía pasando empecé a pensar que igual ese no era el problema.

    En realidad la descarga también la hago por socket. He probado a limpiar el buffer de escritura sigue pasándome lo mismo.

    He intentado bloquear el acceso al fichero para que solo escriba desde el buffer, pero tampoco funciona :-((

    Es posible que el uso de alguna librería de terceros interfiera en el proceso? Es que estoy usando log4net y he visto que algunos mensajes que alteran el zip provienen de esa librería.

    Este es el método que uso para la recepción desde el socket (por si sirve de algo):

    public

     

    void ReceiveFromSocket()
    {
       Socket theSocket;
       try
       {
           if (m_Passive)
              theSocket = m_DataSocket;
           else
              theSocket = m_DataSocket.Accept();
       }
       catch
       {
           throw new SocketException();
       }

     

       try
       {
           int Ret;
           byte[] Buffer = new byte[1024];
          
           //Bloqueamos el acceso al fichero hasta que termine de escribirse para evitar 
           //que se corrompa el fichero.
           lock (this)
           {
               do
               {
                    Buffer =
    new byte[1024];
                    Ret = theSocket.Receive(Buffer);

     

                    if (Ret > 0)
                    {
                         if (m_DownloadToFile)
                         {
                             m_FileStream.Write(Buffer, 0, Ret);
                         }
                         else
                             m_Data += ASCII.GetString(Buffer, 0, Ret);

                         m_TransferredBytes = m_TransferredBytes + Ret;
                         OnDataReceived(Ret);
                     }

               }

    while (Ret != 0);
           }
       }

     

       catch (IOException ioe)
       {
           throw ioe;
       }
       catch 
       {
           throw new SocketException();
       }
       finally
       {
           try
           {  
               theSocket.Shutdown(
    SocketShutdown.Both);}
           catch { }
          
           theSocket.Close();
        }

    }



    martes, 3 de noviembre de 2009 18:47