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 

Perdida de datos utilizando TServerSocket en multiclientes..

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Perdida de datos utilizando TServerSocket en multiclientes.. Responder citando

Bueno compañeros... Aqui voy yo de nuevo....
Resulta que cuando trato de enviar archivos de tamaños
0MB - 25 MB... utilizando TServerSocket.... Los datos se pierden
en el TClienSocket.... es más no se completa la descarga....

Aqui les aporto mi codigo... espero que me ayuden...
Tambien... los ayudare... el codigo que esta aca.....
Lo publicare.... cuando lo termine.... todo el codigo.....


El codigo es el siguiente:

PUERTO DEL SERVIDOR: 1001

PUERTO DEL CLIENTE: 1001
DIRECCION IP: 127.0.0.1




// PARA EL SERVIDOR

int nsend;
void SendSocket(int &index, String sName, TServerSocket *Server);

String fName; // Ruta del archivo
int nsend; // Indice para avanzar hacia el otro socket

__fastcall TServer::TServer(TComponent* Owner)
: TForm(Owner)
{
nsend = 0;
fName = String();
}


void __fastcall TServer::ServerClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
String Rtext = Socket->ReceiveText();
String Option = Rtext.SubString(1,4);

if (Option == "EN$1")
{
// Número de elementos
Cont++;

int n = Server->Socket->ActiveConnections / 2

if (Cont < n)
{
// Rutina que permite avanzar al siguiente Socket
SendSocket(nsend, fName, Server);
}
else
{
// Incializa el Cont
Cont = 0;
// Se habilita el TButton
nsend = 0;
}
}
}


// LA RUTINA SendSocket ESTA DENTRO DE UNA .H PERO
// LA PUEDEN INCLUIR EN EL MISMO CPP DEL FORM...


// Incrementa el número de archivos
void SendSocket(int &index, String sName, TServerSocket *Server)
{
// Obtiene el número de elementos de clientes conectados
// ya que por cada cliente crea dos sockets.... lectura / escritura
int n = Server->Socket->ActiveConnections / 2;

// Si el mensaje llego al equipo server entonces que siga con el otro mensaje
if (index < n)
{
// Se Obtiene la posición para leer del socket
int pos = index+1;

// Se procede a crear una instancia TMemoryStream
TMemoryStream *out = new TMemoryStream();

// Se proce de a leer el archivo
out->LoadFromFile(sName);

// Se obtiene el socket para enviar
TCustomWinSocket *Socket = (TCustomWinSocket*)Server->Socket->Connections[pos];

// Estructura del envio del archivo
String struc = "file#" + sName + "#" + String(out->Size) + "#";

// Se envia la información del archivo
Socket->SendText(struc);

// Se asgina la posicion a cero
out->Position = 0;

// Manejador de la memoria
void *p = out->Memory;

// Se procede a enviar el buffer del archivo
Socket->SendBuf(p, out->Size);

// Se procede a incrementar el indice
index++;
}
else
{
// Se inicializa el index en cero
index = 0;
}

}
//---------------------------------------------------------------------------





// PARA EL CLIENTE

TMemoryStream *out;
bool Receive;
int Size;


__fastcall TClient::TClient(TComponent* Owner)
: TForm(Owner)
{
out = new TMemoryStream;
Receive = false;
Size = 0;
}


void __fastcall TClient::ClientSocketRead(TObject *Sender,
TCustomWinSocket *Socket)
{
String Rtext = Socket->ReceiveText();
String Option = Rtext.SubString(1,4);

// Comprueba si esta recibiendo archivo
if (Receive == true)
{
if (out->Size < Size)
{
out->Write(Rtext.c_str(), Rtext.Length());
}
if (out->Size == Size)
{
// Le avisa al cliente para que libere la memoria
Socket->SendText("end");
// Se recibio el archivo
Receive = false;
// Coloca el tamaño en cero
Size = 0;
// Localiza la posición inicial del archivo
out->Position = 0;
// Se guarda el archivo adquirido
out->SaveToFile("Download\\Temporal\\" + FileName);
// Procede a limpiar memoria
out->Clear();
}
}
else
{
// Verifica si es un archivo
if (Option == "file")
{
// Elimina caracteres hasta llegar a la posicion de #
Rtext.Delete(1,Rtext.Pos("#"));
// Obtiene la ruta del archivo
String Fname = Rtext.SubString(0,Rtext.Pos("#")-1);
// Asigna el nombre del archivo a utilizar
FileName = Fname.SubString(Fname.LastDelimiter("\\")+1,Fname.Length());
// Elimina caracteres hasta llegar a la posicion de #
Rtext.Delete(1,Rtext.Pos("#"));
// Obtiene el tamaño del archivo
Size = StrToInt(Rtext.SubString(0,Rtext.Pos("#")-1));
// Elimina caracteres hasta llegar a la posicion de #
Rtext.Delete(1, Rtext.Pos("#"));
// Coloca que va a recibir un archivo
Receive = true;
}
}

}
//---------------------------------------------------------------------------

:cry:
[/url]
_________________
Manuel Gorut
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Q tipo de servicio estas usando en los sockets?

Si es de tipo UDP(sock_dgram) ve cambiandolo a TCP (sock_stream).


Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Lo que pasa es que yo utilizo TCP....

Los componentes que uso son:

TServerSocket, TClientSocket

Son TCP/IP....


En ningun momento he estado utilizando UDP.... ya que no cuento con el conocimiento .... porque el tiempo es corto... porque tengo que entregar el proyecto.... pronto.....


Yo he utilizado SendStream(); tambien SendBuffer();
pero siempre el programa no me envia la ultima linea del archivo....
Yo estoy enviando archivos PE... osea ejecutables,,,,, por la red....

No tengo ni la menor idea que es lo que esta pasando...
Sera que el puerto que utilizo no es el adecuado...
La verdad no tengo idea.... y eso es lo que me tiene un poco Sad



Agradezco su colaboración....
Voy a publicar un proyecto que hice en TIPS & TICKS....
Para aportar en el foro.....
Ya que tengo ayudar a la gente como uno.... que quiere aprender..


Como dice un tocayo de mi pais... que esta en este foro....


Solo se que nada se....

"Entre mas conozco, mas desconozco..."

Saludos...
_________________
Manuel Gorut
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

1.- el codigo que tienes es correcto... el unico detalle es que cuando envias el archivo, y cambias de socket como lo haces en el for.

el socket destino se pierde.
intenta pasar con 1 solo y veras que el archivo llega...

2.- por el envio de archivos grandes... al parecer el socket, solo aguanta hasta 65 megas. esto es en teroria ya que estas usando un int como parte del socket. intenta untilizar _int64 en cuanto al tamaño del archivo.

se que no debo hacer esto... pero te paso por el momento esta información, sin resultados favorables, para ti. en estos dias ando un poco ocupado... tengo un programa que hice para envio y recepcion de archivos.. e igual te dire lo siguiente. quise enviar un archivo de 120 megs y tambien tuve el fallo de que no lo recibia, pero es por que en el tamaño del archvo me pone -1, es to es que el archivo que debe medir 122 mil 880 bytes, no puede almacenarse dentro de un int que le caben 65535 bytes

espero que para el dia sabado.. pueda darte una respuesta concreta y poder solucionar tu problema...

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

Cesar ya veo que eres el mas ducho con este tema , me podrias corregir un poco el codigo anterior para mandar solo a un cliente , me estoy aventurando en el tema pero hasta aca no llego. Hasta ahora tengo todo un programa hecho para comunicacion entre clientes , donde se los cilientes que estan conectados, tengo las trazas , los puedo desconectar a mi antojo, y mandar el ip del que desee a una lista negra donde si estan alli no podran conectarse nuevamente , he inplementado codigo que das en el foro sobre saber si esta el server activo o no , pero como te comento esto de mandar ficheros se me va de las manos y no quiero hacerlo con los fasnet, me podrias ayudar por favor

gracias
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola.

Puedes enviarme parte de tu codigo a ccsg259(arroba)prodigy.net.mx

puedo darle una mirada y saber que esta pasando con tu codigo o bien muestra en este link o habre otro con el codigo que utilizas para enviar y recibir el archivo enviandome un mensaje privado con el enlace para estar al tanto de ello.

Saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
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.