Bueno, despues de mucho trabajo lo hice funcionar y va genial aunque seguramente tendrá fallos que no haya visto.
Ahora estoy liado con el envio y recepcion de archivos y para eso hago esto:
Para recibir:
Código PHP:
//---------------------------------------------------------------------------
// 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
AnsiString MensajeRecibido;
char aux[10];
char buffer[1024];
int retval;
MensajeRecibido = Socket->ReceiveText();
memcpy(aux,MensajeRecibido.c_str(),10);
if(strncmp(aux, flagFile,10) == 0)
{
do{
memset(buffer,0,sizeof(buffer));
//Aqui gestiono para recibir el archivo
retval = Socket->ReceiveBuf(buffer,SIZEBLOCK);
}while(retval != -1);
}else{
//Si no es una imagen mostramos el mensaje enviado
RichEdit1->SelStart = RichEdit1->Text.Length();
RichEdit1->SelLength = 0;
RichEdit1->SelAttributes->Color = clGreen;
MensajeRecibido = EditServer->Text + ": " + MensajeRecibido;
RichEdit1->Lines->Add(MensajeRecibido); // Añadir los datos al memo de recepción
}
}
//---------------------------------------------------------------------------
// Se produce cuando el socket de servidor debe leer la información de un socket cliente.
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString MensajeRecibido;
char aux[10];
char buffer[1024];
int retval;
MensajeRecibido = Socket->ReceiveText();
memcpy(aux,MensajeRecibido.c_str(),10);
if(strncmp(aux, flagFile,10) == 0)
{
do{
memset(buffer,0,sizeof(buffer));
//Aqui gestiono para recibir el archivo
retval = Socket->ReceiveBuf(buffer,SIZEBLOCK);
}while(retval != -1);
}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 + ": " + MensajeRecibido); // Añadir los datos al memo de recepción
}
}
Para enviar:
Código PHP:
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)
{
if(IsServer){
retval = ServerSocket->Socket->Connections[0]->SendBuf(flagFile, sizeFlag);
}else{
retval = ClientSocket->Socket->SendBuf(flagFile, sizeFlag);
}
if(retval == sizeFlag)
{
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.");
}
}
}
}
El que manda el archivo da los errores "Error en el envio del fichero" y "Error en el envio del fichero. El tamaño del fichero original no coincide con el tamaño del fichero enviado." mientras que el que recibe, que lo que hace simplemente es una prueba recuperando toda la pila sin guardar nada, cuando termina da una excepcion. ¿que se me escapa para poder enviar un archivo? Adjunto el proyecto a ver si podeis mirarlo y me echan un cable.