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 Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #14  
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, 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(auxflagFile,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(auxflagFile,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 0leidos 0retval 0;

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

                
fseek(hFile0SEEK_SET);

                if(
hFile)
                {
                   if(
IsServer){
                      
retval ServerSocket->Socket->Connections[0]->SendBuf(flagFilesizeFlag);
                   }else{
                      
retval ClientSocket->Socket->SendBuf(flagFilesizeFlag);
                   }

                   if(
retval == sizeFlag)
                   {
                           while(!
feof(hFile))
                           {
                                
//voy por aqui y no funciona
                                
leidos fread(buffersizeof(char), SIZEBLOCK,hFile);

                                if(
IsServer){
                                   
retval ServerSocket->Socket->Connections[0]->SendBuf(bufferleidos);
                                }else{
                                   
retval ClientSocket->Socket->SendBuf(bufferleidos);
                                }

                                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.
Archivos Adjuntos
Tipo de Archivo: rar Chat con sockets en C++Builder.rar (9,8 KB, 2 visitas)
Responder Con Cita
 



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 14:04:08.


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