Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #24  
Antiguo 07-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Tienes un eror de concepto. Cuando esperas recibir el archivo y se dispara el evento SocketRead, en tu código, primero lees cosas (estructura del archivo, MD5...) con lo que estás perdiendo datos, pues en ese momento ya estás recibiendo los primeros bloques del archivo. Fíjate en este cambio que realizo en tu código y verás que ya funciona. Seguramente este error lo tenías en otras formas de leer tu archivo:

Código PHP:
void __fastcall TChatForm::SocketRead(TCustomWinSocket *Socket)
{
  if(
recvFile == true && recvStructFile == true)
  {
           
//Aqui recibimos el archivo
           
int recibidos ReceiveFile(Socket->SocketHandleNewPath.c_str(), archivo.size);

           
RichEdit1->SelStart RichEdit1->Text.Length();
           
RichEdit1->SelLength 0;
           
RichEdit1->SelAttributes->Color clPurple;
           
RichEdit1->Lines->Add("Finalizó la recepcion del archivo.");

           
recvFile false;
           
recvStructFile false;
           
archivo.end true;
           if(
recibidos != archivo.size)
           {
                
RichEdit1->SelStart RichEdit1->Text.Length();
                
RichEdit1->SelLength 0;
                
RichEdit1->SelAttributes->Color clPurple;
                
RichEdit1->Lines->Add("El archivo está corrupto. El tamaño del archivo enviado y del recibido son diferentes.");
           }else{
                
RichEdit1->SelStart RichEdit1->Text.Length();
                
RichEdit1->SelLength 0;
                
RichEdit1->SelAttributes->Color clPurple;
                
RichEdit1->Lines->Add("Archivo recibido correctamente.");
           }
           
Edit1->Enabled true;
           
ButtonSendFile->Enabled true;
           
TrackBarMiliseconds->Enabled true;
           
CheckBoxListen->Enabled true;
           
ButtonExit->Enabled true;
           
ButtonDisconnect->Enabled true;

           
//Calculo el MD5 del archivo recibido y lo comparo con el del archivo enviado
           
char md5[33];

           
memset(md50sizeof(md5));
           
strcpy(md5ObtenerMD5(NewPath.c_str()).c_str());
           
           if(
strncmp(md5archivo.MD532) == 0)
           {
                
RichEdit1->SelStart RichEdit1->Text.Length();
                
RichEdit1->SelLength 0;
                
RichEdit1->SelAttributes->Color clPurple;
                
RichEdit1->Lines->Add(AnsiString().sprintf("Los MD5 coinciden. MD5: %s"md5));
           }else{
                
RichEdit1->SelStart RichEdit1->Text.Length();
                
RichEdit1->SelLength 0;
                
RichEdit1->SelAttributes->Color clRed;
                
RichEdit1->Lines->Add(AnsiString().sprintf("Los MD5 no coinciden. MD5 del enviado: %s | MD5 del recibido: %s"archivo.MD5md5));
           }

           
SetForegroundWindow(ChatForm->Handle);
  }


  
// Cuando el servidor envia datos al ciente y este los ha de procesar
  
char flagFile[SIZEFLAG] = {"\n\n_File_\n\n\0"};
  
unsigned char *buffer;
  
int size,lenBuff;
  
lenBuff Socket->ReceiveLength();
  
buffer = new unsigned char[lenBuff];
  
memset(buffer,0,sizeof(buffer));

  
size Socket->ReceiveBuf(buffer,lenBuff);
  if(
strcmp(bufferflagFile) == 0)
  {
        
recvFile true;
        
RichEdit1->SelStart RichEdit1->Text.Length();
        
RichEdit1->SelLength 0;
        
RichEdit1->SelAttributes->Color clPurple;
        
RichEdit1->Lines->Add("Recibiendo archivo. Espera a que termine y no cierres la aplicación.");
        
Edit1->Enabled false;
        
ButtonSendFile->Enabled false;
        
TrackBarMiliseconds->Enabled false;
        
CheckBoxListen->Enabled false;
        
ButtonExit->Enabled false;
        
ButtonDisconnect->Enabled false;
  }
  else if(
recvFile == true && size == sizeof(archivo) )
  {
        
memcpy(archivo.namebuffersizeof(archivo.name));
        
memcpy(&archivo.sizebuffer sizeof(archivo.name), sizeof(archivo.size));
        
memcpy(&archivo.blocksbuffer sizeof(archivo.name) + sizeof(archivo.size), sizeof(archivo.blocks));
        
memcpy(&archivo.endbuffer sizeof(archivo.name) + sizeof(archivo.size) + sizeof(archivo.blocks), sizeof(archivo.end));
        
memcpy(&archivo.MD5buffer sizeof(archivo.name) + sizeof(archivo.size) + sizeof(archivo.blocks) + sizeof(archivo.end), sizeof(archivo.MD5));

        if(
archivo.end == false)
        {
           
NewPath ExtractFilePath(Application->ExeName) +"_"archivo.name;

           if(
FileExists(NewPath))
                
DeleteFile(NewPath);
           
recvStructFile true;
        }
  } else{
     
//Si no es una imagen mostramos el mensaje enviado
     
RichEdit1->SelStart RichEdit1->Text.Length();
     
RichEdit1->SelLength 0;
     
RichEdit1->SelAttributes->Color clGreen;
     
RichEdit1->Lines->Add(Socket->RemoteHost ": " AnsiString((char*)buffer).SubString(1,size) );  // Añadir los datos al memo de recepción
  
}
  
delete [] buffer;

Saludos.
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ellas y Ellos jcarteagaf Humor 1 06-08-2011 03:43:05
Llamada entre ventana usando paquetes. PittyDelphi OOP 3 27-01-2011 12:28:37
¿Saben algo de ellos? roman La Taberna 11 18-11-2008 18:59:07
Comunicación TCP/IP entre dos programas usando componentes INDY Roger_Delphi Internet 2 20-10-2008 14:02:49
Comunicacion entre procesos walito Varios 0 14-11-2007 21:55:53


La franja horaria es GMT +2. Ahora son las 02:19:10.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi