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.