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->SocketHandle, NewPath.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(md5, 0, sizeof(md5));
strcpy(md5, ObtenerMD5(NewPath.c_str()).c_str());
if(strncmp(md5, archivo.MD5, 32) == 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.MD5, md5));
}
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(buffer, flagFile) == 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.name, buffer, sizeof(archivo.name));
memcpy(&archivo.size, buffer + sizeof(archivo.name), sizeof(archivo.size));
memcpy(&archivo.blocks, buffer + sizeof(archivo.name) + sizeof(archivo.size), sizeof(archivo.blocks));
memcpy(&archivo.end, buffer + sizeof(archivo.name) + sizeof(archivo.size) + sizeof(archivo.blocks), sizeof(archivo.end));
memcpy(&archivo.MD5, buffer + 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.