Ver Mensaje Individual
  #16  
Antiguo 03-10-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 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(bufferflagFile) == 0)
  {
        
unsigned char *aux = new char[+ (lenBuff SIZEFLAG)];
        
memset(aux,0,sizeof(aux));
        
memcpy(auxbuffer SIZEFLAGlenBuff 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