Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Envio de Archivos por Client y Server Socket

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Envio de Archivos por Client y Server Socket Responder citando

Hola, saludos ahora me toca a mi preguntar.
como le hago para introducir, dentro del bufer que envia un Socket hacia otro, el nombre del archivo.

ejemplo para enviar, un flujo de datos a un ServerSocket
Código:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TOpenDialog *op;
    TFileStream *ms;
    char        *Buf;
    AnsiString     sName;
    op = new TOpenDialog(this);
    if( !op->Execute() )
    {
        delete op;
        op = NULL;
        return;
    }
    sName = op->FileName;
    delete op;
    op = NULL;
    if( !FileExists( sName ) ) return;



    ms = new TFileStream(sName, fmOpenRead);
    Buf = new char[ms->Size];
    ::memset( Buf, 0x00, ms->Size );
    ms->Read(Buf, ms->Size);
//aqui el problema antes de enviar el buf, tambien meter el nombre del archivo
// en su caso tambien el tamaño del archivo, para saber cuantos bytes leer
    this->ClientSocket1->Socket->SendBuf(Buf, ms->Size);//envio los datos y luego el nombre
    delete [] Buf;
    Buf = NULL;
    delete ms;
    ms = NULL;
}
//---------------------------------------------------------------------------



y este es el codigo para recuperar el archivo.

Código:

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
    Recibe(Socket);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Recibe(TCustomWinSocket *Socket)
{
  int   s  = Socket->ReceiveLength();
  char *p = new char[s];
  ::memset( p, 0x00, s);
  Socket->ReceiveBuf(p, s);
  // Creamos el archivo
//  TFileStream *fs = new TFileStream("test.txt", fmCreate);
  TFileStream *fs = new TFileStream("dato", fmCreate);
  fs->Write(p, s);
  delete [] p;
  p = NULL;
  delete fs;
  fs = NULL;
}
//---------------------------------------------------------------------------

Como se ve, meto el codigo para recibir los datos el "Buf", ya que si se envian 2 archivos al mismo tiempo, se genera un socket para cada una de las conexiones. y asi no se corta o no se transfieren los archivos..

la pregunta es como enviar usando los componentes ClientSocket y ServerSocket un archivo y guardarlo con el mismo nombre a travez de una red..
he probado usando otros componentes, pero al parecer tiene cierta dificultad al ser puestos con el ClientSocket y el ServerSocket

alguna idea..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Medio encontrado, ya que no permite archivos grandes hablamos de archivos arriba de 65 megas

http://www.sources.ru/magazine/1204/tsocket.html

se puede mejorar la funcion, pero eso lo hare mas adelante

Gracias, a todos por leer
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Saludos Cesar, yo tambien estoy trabajando en un proyecto similar de envio de archivos a traves de socket y la funcion que conseguiste esta perfecta solo 2 preguntas. porque dices que no funciona con archivos mayores a 65 megas he probado con archivos mayores a los 200 mb y me ha funcionado perfecto se tarda bastante pero funciona, la siguiente pregunta sabes como se podria hacer para poner un resume a esa funcion para que el cliente le ponga pausa y pueda seguir enviando el archivo mas tarde nose si me entiendes cuidate.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Cita:
porque dices que no funciona con archivos mayores a 65 megas he probado con archivos mayores a los 200 mb y me ha funcionado perfecto

fue cuando quise enviar 2 archivos al mismo tiempo.

Cita:
sabes como se podria hacer para poner un resume a esa funcion para que el cliente le ponga pausa y pueda seguir enviando el archivo mas tarde

Se tendria que hacer una clase, derivada, para poder establecer un "autoresume", como el comando resume que tienen los FTP, pero deberias modificar el envio del archivo por tramas, lo correcto es enviar tramas de 1024 para no tener problemas, pero en el servidor que recibe los datos, tambien se tiene que modificarlo para saber que archivo enviaste el nombre y la parte de donde te quedaste descargando, recuerda que son flujos de datos,

imagina lo siguiente el envio de datos, es como cuando tienes 10 vasos de agua (simulando 10 archivos) y los tiras al desagüe o en un tubo de cañeria, bien cuando los recibes del otro lado, debes identificar que parte del archivo archivo pertenece a que archivo, y eso es a travez de las tramas.

por eso indicaba que se tenia que mejorar la forma de enviar los archivos, otra cuestion, es que se manejen componentes esclusivos para FTP, lo que se intenta es enviar archivos al otro lado de una maquina, tal y cual fuera el MSN, como vez, no tiene pausa, envias o cancelas pero no tiene pausa, los FTP si lo tienen.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchisimas gracias Cesar por la informacion, tienes razon en lo que me dices al enviar los archivos a traves de socket no tienen pausa al menos con el codigo tal y como esta, yo la aplicacion en la que estaba trabajando la tenia en FTP pero al ver la nueva version del builder y ver que los componetes con los que la habia hecho ya no me servian opte por hacerla con socket ya que son mas genericos, pero probare como me sale mejor,
porque sí necesito la opcion de pausar los archivos o darles un resume, te agradesco mucho la ayuda saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

no hay problema, en cuanto mejore la funcion seguro la pongo en Tips y Trucos

Estamos en contacto..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Cesar pudistes mejora r la funcion , es que la pagina a la que haces referencia no se abre, me ayudas con el tema por favor?
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.