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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-10-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
amigo ya he conseguido hacer eso pero ahora quiero enviar archivos y como en c++builder para el chat lo tengo asincronico pues no puedo ir recibiendo trozos e indicar al servidor que ya llegó para que siga ya que me los manda todos de golpe y lo mando en bloques de 1024 bytes y si pasa de 8192 bytes (8 bloques) el servidor da error al enviar y ademas al usar retval = Socket->ReceiveBuf(buffer,lenBuff); lo que obtengo es tanto la cadena que envio como flag para indicar que es un archivo lo que quiero enviar, como el contenido del archivo, todo en un bloque de 8192 y luego vuelve a entrar en el evento y me muestra el resto como mensajes de texto. ¿como hago para mandar bloques de un archivo y que el cliente lo reciba como tal y luego los una y obtenga un archivo igual que el original? Para archivos pequeños he hecho esto:
Código PHP:
#define SIZEBLOCK 1024
#define SIZEFLAG 11

char flagFile[SIZEFLAG] = {"\n\n_File_\n\n\0"};

void __fastcall TChatForm::ClientSocketRead(TObject *Sender,
      
TCustomWinSocket *Socket)
{
  
// Cuando el servidor envia datos al ciente y este los ha de procesar
  
unsigned char *buffer;
  
int retval,lenBuff;

  
lenBuff = Socket->ReceiveLength();
  
buffer = new char[lenBuff + 1];
  
memset(buffer,0,sizeof(buffer));

  
retval = Socket->ReceiveBuf(buffer,lenBuff);

  if(
strcmp(buffer, flagFile) == 0)
  {
        
unsigned char *aux = new char[1 + (lenBuff - SIZEFLAG)];
        
memset(aux,0,sizeof(aux));
        
memcpy(aux, buffer + SIZEFLAG, lenBuff - SIZEFLAG);
        
FILE *salida;
        
salida = fopen("salida.txt","wb");
        
fwrite(aux,lenBuff - SIZEFLAG,1,salida);
        
fclose(salida);
        
delete [] aux;
  }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(EditServer->Text + ": " + AnsiString( (char*)buffer));  // Añadir los datos al memo de recepción
  
}
  
delete [] buffer;
} 
Con eso puedo enviar un archivo de texto de 8192 - SIZEFLAG sin problemas pero si se pasa de ese tamaño ya tengo el problema.
Responder Con Cita
  #2  
Antiguo 03-10-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
A ver, para archivos pequeño he hecho esto y funciona:
Código PHP:
char flagFile[SIZEFLAG] = {"\n\n_File_\n\n\0"};
struct{
        
char name[256];
        
long size;
}
archivo;

bool recvFile, recvStructFile;

void __fastcall TChatForm::ButtonSendFileClick(TObject *Sender)
{ 
//Aqui se envia el fichero

        
long tamanio = 0;
        
char buffer[SIZEBLOCK];
        
FILE *hFile;
        
int enviados = 0, leidos = 0, retval = 0;

        if(
OpenDialog1->Execute())
        {
                
hFile = fopen(OpenDialog1->FileName.c_str(),"rb");
                
fseek(hFile, 0, SEEK_END);
                
tamanio = ftell(hFile);

                
fseek(hFile, 0, SEEK_SET);

                if(
hFile)
                {
                   
strcpy(archivo.name, ExtractFileName(OpenDialog1->FileName).c_str());
                   
archivo.size = tamanio;

                   if(
IsServer){
                      
retval = ServerSocket->Socket->Connections[0]->SendBuf(flagFile, SIZEFLAG);
                      
retval += ServerSocket->Socket->Connections[0]->SendBuf(&archivo, sizeof(archivo));
                   }else{
                      
retval = ClientSocket->Socket->SendBuf(flagFile, SIZEFLAG);
                      
retval += ClientSocket->Socket->SendBuf(&archivo, sizeof(archivo));
                   }

                   if(
retval == (SIZEFLAG + sizeof(archivo)))
                   {
                           while(!
feof(hFile))
                           {
                                
//voy por aqui y no funciona
                                
leidos = fread(buffer, sizeof(char), SIZEBLOCK,hFile);

                                if(
IsServer){
                                   
retval = ServerSocket->Socket->Connections[0]->SendBuf(buffer, leidos);
                                }else{
                                   
retval = ClientSocket->Socket->SendBuf(buffer, leidos);
                                }

                                if(
retval != leidos)
                                {
                                   
RichEdit1->SelStart = RichEdit1->Text.Length();
                                   
RichEdit1->SelLength = 0;
                                   
RichEdit1->SelAttributes->Color = clRed;
                                   
RichEdit1->Lines->Add("Error en el envio del fichero");
                                   break;
                                }else{
                                   
enviados += retval;
                                }

                                if(
ferror(hFile))
                                {
                                   
RichEdit1->SelStart = RichEdit1->Text.Length();
                                   
RichEdit1->SelLength = 0;
                                   
RichEdit1->SelAttributes->Color = clRed;
                                   
RichEdit1->Lines->Add("Error durante la lectura del fichero. Vuelva a intentarlo.");
                                   break;
                                }
                           }
                   }else{
                        
RichEdit1->SelStart = RichEdit1->Text.Length();
                        
RichEdit1->SelLength = 0;
                        
RichEdit1->SelAttributes->Color = clRed;
                        
RichEdit1->Lines->Add("Error inesperado al enviar el archivo.");
                   }
                   
fclose(hFile);

                   if(
tamanio != enviados)
                   {
                      
RichEdit1->SelStart = RichEdit1->Text.Length();
                      
RichEdit1->SelLength = 0;
                      
RichEdit1->SelAttributes->Color = clRed;
                      
RichEdit1->Lines->Add("Error en el envio del fichero. El tamaño del fichero original no coincide con el tamaño del fichero enviado.");
                   }
                }
        }
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Se produce cuando un socket de cliente debe leer la información de la conexión de socket.
//---------------------------------------------------------------------------
void __fastcall TChatForm::ClientSocketRead(TObject *Sender,
      
TCustomWinSocket *Socket)
{
  
// Cuando el servidor envia datos al ciente y este los ha de procesar
  
unsigned char *buffer;
  
int size,lenBuff;

  
lenBuff = Socket->ReceiveLength();
  
buffer = new char[lenBuff + 1];
  
memset(buffer,0,sizeof(buffer));

  
size = Socket->ReceiveBuf(buffer,lenBuff);

  if(
strcmp(buffer, flagFile) == 0)
  {
        
recvFile = true;
  }

  else if(
recvFile == true && size == (sizeof(archivo.name) + sizeof(archivo.size)))
  {
        
memcpy(archivo.name, buffer, sizeof(archivo.name));
        
memcpy(&archivo.size, buffer + sizeof(archivo.name), sizeof(archivo.size));
        
recvStructFile = true;
  }else if(
recvFile == true && recvStructFile == true){
        
FILE *salida;
        
salida = fopen(AnsiString(ExtractFilePath(Application->ExeName) + "\\\\" + archivo.name).c_str(),"wb");
        
fwrite(buffer, size, 1, salida);
        
fclose(salida);
  }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(EditServer->Text + ": " + AnsiString( (char*)buffer));  // Añadir los datos al memo de recepción
  
}
  
delete [] buffer;
}

//---------------------------------------------------------------------------
// Se produce cuando el socket de servidor debe leer la información de un socket cliente.
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketClientRead(TObject *Sender,
      
TCustomWinSocket *Socket)
{
  
// Cuando el cliente envia datos al servidor y este los ha de procesar
  
unsigned char *buffer;
  
int size,lenBuff;

  
lenBuff = Socket->ReceiveLength();
  
buffer = new char[lenBuff + 1];
  
memset(buffer,0,sizeof(buffer));

  
size = Socket->ReceiveBuf(buffer,lenBuff);

  if(
strcmp(buffer, flagFile) == 0)
  {
        
recvFile = true;
  }

  else if(
recvFile == true && size == (sizeof(archivo.name) + sizeof(archivo.size)))
  {
        
memcpy(archivo.name, buffer, sizeof(archivo.name));
        
memcpy(&archivo.size, buffer + sizeof(archivo.name), sizeof(archivo.size));
        
recvStructFile = true;
  }else if(
recvFile == true && recvStructFile == true){
        
FILE *salida;
        
salida = fopen(AnsiString(ExtractFilePath(Application->ExeName) + "\\\\" + archivo.name).c_str(),"wb");
        
fwrite(buffer, size, 1, salida);
        
fclose(salida);
  }else{
     
// Cuando el cliente envia datos al servidor y este los ha de procesar
     
RichEdit1->SelStart = RichEdit1->Text.Length();
     
RichEdit1->SelLength = 0;
     
RichEdit1->SelAttributes->Color = clGreen;
     
RichEdit1->Lines->Add(Socket->RemoteHost + ": " + AnsiString( (char*)buffer));  // Añadir los datos al memo de recepción
  
}
} 
Tiene un problema y es que cuando se hace un SendBuf, al ser asincronico, no espera respuesta y como tarde mas de la cuenta en llegar el bloque, se acumulan y se añaden los bloques unos a otros, o sea, si el primer paquete mide 11 y el segundo mide 260, como tarde mucho en llegar el primero llegara un solo paquete de 271 y asi con todo lo que se envie. Ese es el problema que tengo para poder enviar archivos mas grandes tambien. No se como hacer para que no envie otro paquete hasta que reciba el cliente el anterior y lo procese y asi con todos.
Responder Con Cita
  #3  
Antiguo 03-10-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Bueno, he conseguido transferir archivos aunque no creo que sea del todo correcto lo que hago para conseguirlo . Primero paso una mascara para indicar que es un envio de archivo y a continuacion mando una estructura donde indico el nombre del archivo, su tamaño, y el número de bloques a enviar. He colocado un Sleep para poder enviar sin perder datos por el camino. Os adjunto el fuente para que si alguien quiere mirarlo y ayudarme a mejorarlo para hacerlo funcionar correctamente pues se lo agradeceria ya que a veces se pierden bytes por el camino aunque la mayor parte de las veces llega el fichero correctamente pero otras veces se queda el receptor esperando como si faltara algun bloque por llegar.

Aqui el link
Responder Con Cita
  #4  
Antiguo 04-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
No creo que estés usando el método adecuado. Es mejor que la comunicación sea síncrona y ten en cuenta que los paquetes se pueden unir o separar. No tengo ahora tiempo de realizar un ejemplo. Puedes, también, usar la API TransmitFile

Te dejo un fragmento de código funcional para recibir ficheros por esta vía, previamente debes haber comunicado el tamaño del fichero y nombre a transferir (SizeFile y lpPathName):
Código PHP:
  int  Size = 1024*10;
  
BYTE *Buffer = (BYTE*)VirtualAlloc(0, Size, MEM_COMMIT, PAGE_READWRITE);
  
UINT  Len = 0;
  
int   nBytes = 0;
  
HANDLE hFile = CreateFile(lpPathName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0);
  if(
hFile != INVALID_HANDLE_VALUE){
    do {
      
Len = Recv(Sock, Buffer, Size, 0, 10000);
      if(
Len == -1) break;
      
_lwrite((int)hFile, Buffer, Len);
      
nBytes += Len;
    } while (
nBytes != FileSize)
    
CloseHandle(hFile);
  }
  
VirtualFree(Buffer, 0, MEM_RELEASE); 
Saludos.
Responder Con Cita
  #5  
Antiguo 04-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Bueno, te he preparado un rápido ejemplo sobre el chat que te envié antes y sin usar componentes de VCL. Sokets "a pelo".

En el chat, si el cliente envía "Envia Fichero" (sin acento para no confundir caracteres), el servidor envía un fichero llamado Prueba0.bmp que es un bmp grande. El cliente lo recibe y lo guarda como Prueba.bmp. A continuación el server recibe la palabra y sigue la comunicación...

Te expongo las funciones que envían y reciben el fichero:

TransmitFile.h
Código PHP:
#ifndef TRANSMIT_FILE_H
#define TRANSMIT_FILE_H

void TransmitFile(SOCKET Sock, char* lpPathName);
void ReceiveFile(SOCKET Sock, char* lpPathName, int FileSize);
void ReceiveFile(SOCKET Sock);

#endif 
TransmitFile.cpp
Código PHP:
#include <windows.h>
#include <winsock2.h>
#include <Mswsock.h>

#include "TrasmitFile.h"

struct TFileData{
  
char FilePath[MAX_PATH*2];
  
int FileSize;
};

void TransmitFile(SOCKET Sock, char* lpPathName)
{
  if(
Sock == INVALID_SOCKET || !lpPathName) return;
  if(!*
lpPathName) return;

  
char Msg[10];
  
HFILE hFile = _lopen(lpPathName, OF_READ);
  if(
hFile == -1) return;
  
int FileSize = GetFileSize((HANDLE)hFile, 0);
  
TFileData FileData;
  
strcpy(FileData.FilePath, lpPathName);
  
FileData.FileSize = FileSize;
  
send(Sock, (char*)&FileData, sizeof(TFileData), 0);
  
recv(Sock, Msg, sizeof(Msg),0);
  if(!
strncmp(Msg, "Ok", 2)){
    
TransmitFile(Sock, (HANDLE)hFile, FileSize, 0,0,0,0);
  }
  
_lclose(hFile);
}

void ReceiveFile(SOCKET Sock)
{
  
TFileData FileData;
  
recv(Sock, (char*)&FileData, sizeof(FileData),0);
  
send(Sock, "Ok", 2, 0);
  
ReceiveFile(Sock, "Prueba.bmp", FileData.FileSize);

}

void ReceiveFile(SOCKET Sock, char* lpPathName, int FileSize)
{
  
int  Size = 1024*10;
  
BYTE *Buffer = (BYTE*)VirtualAlloc(0, Size, MEM_COMMIT, PAGE_READWRITE);
  
UINT  Len = 0;
  
int   nBytes = 0;
  
HANDLE hFile = CreateFile(lpPathName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0);
  if(
hFile != INVALID_HANDLE_VALUE){
    do {
      
Len = recv(Sock, Buffer, Size, 0);
      if(
Len == -1) break;
      
_lwrite((int)hFile, Buffer, Len);
      
nBytes += Len;
    } while (
nBytes != FileSize);
    
CloseHandle(hFile);
  }
  
VirtualFree(Buffer, 0, MEM_RELEASE);
} 
Usa la API TransmitFile, que usa socket, puedes sustituirla por una función equivalente a bajo nivel.

PD/ Borro el anterior chat porque este es idéntico, añadiendo la nueva funcionalidad

Saludos.

Última edición por escafandra fecha: 24-03-2018 a las 13:09:57.
Responder Con Cita
  #6  
Antiguo 05-10-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Amigo he estado haciendo pruebas con la api que comentas pero claro, tu usas un tipo SOCKET y yo intento hacer lo mismo con un TSocketServer y un TSocketClient y la verdad es que todo lo que pruebo acaba retornandome false en TransmitFile. He probado esto:

Código PHP:
bool transmitido;
if(
IsServer){
   
transmitido = TransmitFile((unsigned int)ServerSocket->Socket->Connections[0]->Handle, (HANDLE)hFile, tamanio, 0,0,0,0);
}else{
   
transmitido = TransmitFile((unsigned int)ClientSocket->Socket->Handle, (HANDLE)hFile, tamanio, 0,0,0,0);
} 
y esto:
Código PHP:
bool transmitido;
if(
IsServer){
   
transmitido =  TransmitFile((unsigned  int)ServerSocket->Socket->Handle,  (HANDLE)hFile, tamanio, 0,0,0,0);
}else{
   
transmitido = TransmitFile((unsigned int)ClientSocket->Socket->Handle, (HANDLE)hFile, tamanio, 0,0,0,0);
} 
y tambien esto:
Código PHP:
bool transmitido;
if(
IsServer){
   
transmitido =  TransmitFile((unsigned  int)ServerSocket->Handle,  (HANDLE)hFile, tamanio, 0,0,0,0);
}else{
   
transmitido = TransmitFile((unsigned int)ClientSocket->Handle, (HANDLE)hFile, tamanio, 0,0,0,0);
} 
y en todos los casos retorna como false y en el receptor no hay señales de que se reciba algo. Son asincronicos y no se si esto tiene que ver.
Responder Con Cita
  #7  
Antiguo 06-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Para poder usar la API de winsocket desde los componentes VCL TServerSocket y TClientSocket, debes usar ServerSocket->Socket->SocketHandle o ClientSocket->Socket->SocketHandle


Saludos.
Responder Con Cita
  #8  
Antiguo 06-10-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Bueno amigo, he estado viendo el modo en que me indicabas y he modificado mi funcion para que use lo que me indicabas, o sea, uso TransmitFile y una funcion propia llamada ReceiveFile. El problema es que el archivo que recibo es corrupto porque termina la funcion de recepcion pero no recibo todos los bytes. He comprobado que en la funcion ReceiveFile salgo del bucle con el break en vez de salir porque nBytes sea igual a FileSize. Lo que pienso es que se pueden estar perdiendo bytes por el camino pero no tengo ni idea ya que uso TransmitFile y no se como funciona esta por dentro. Adjunto el proyecto por si quereis mirarlo a ver que puede estar pasando.
Archivos Adjuntos
Tipo de Archivo: rar Chat con sockets en C++Builder.rar (13,1 KB, 1 visitas)
Responder Con Cita
  #9  
Antiguo 07-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
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->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.
Responder Con Cita
  #10  
Antiguo 07-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Aprovecho para mostrarte como obtener el Hash MD5 de un archivo con la API de Windows tal y como lo utilicé en este ejemplo para cazar un virus: TerminateMD5_Process, a la caza de un virus...

Código PHP:
//---------------------------------------------------------------------------
#define MD5LEN  16
#define BUFSIZE 1024
typedef CHAR TMD5[33];


void GetMD5FromFile(CHAR* FileName, CHAR *MD5)
{
  
HANDLE hFile = 0;
  
HCRYPTPROV hProv = 0;
  
HCRYPTHASH hHash = 0;
  
BYTE Hash[MD5LEN];
  
DWORD bHash = 0;
  
DWORD bRead = 0;
  
BYTE* Buffer = (BYTE*)VirtualAlloc(0, BUFSIZE, MEM_COMMIT, PAGE_READWRITE);
  
hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 

NULL);
  if(
hFile != INVALID_HANDLE_VALUE){
    if(
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)){
      if(
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)){
        while (
1) {
          
ReadFile(hFile, Buffer, BUFSIZE, &bRead, NULL);
          if(!
bRead) break;
          
CryptHashData(hHash, Buffer, bRead, 0);
        }
        
bHash = MD5LEN;
        if(
CryptGetHashParam(hHash, HP_HASHVAL, Hash, &bHash, 0)){
          for(
int i=0; i<2*MD5LEN; i++){
            
MD5[i] = (0x0F & Hash[i/2] >> 4*((i+1)%2)) + 48;
            if(
MD5[i] > '9') MD5[i] += 7;
          }
          
MD5[32] = 0;
        }
      }
      
CryptDestroyHash(hHash);
    }
    
CryptReleaseContext(hProv, 0);
  }
  
CloseHandle(hFile);
  
VirtualFree(Buffer, 0, MEM_RELEASE);
} 
Saludos.
Responder Con Cita
Respuesta


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 21:32:28.


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