 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
mgorut Cdt


Registrado: 27 Ene 2005Mensajes: 7Ubicación: Barranquilla, Atlántico; Colombia
|
Publicado: Mie 21 Jun, 2006 1:56 pm Asunto: Perdida de datos utilizando TServerSocket en multiclientes.. |
|
|
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 |
|
 |
Roid Cmdr

Registrado: 18 Ene 2004Mensajes: 135
|
Publicado: Jue 22 Jun, 2006 2:13 am Asunto: |
|
|
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 |
|
 |
mgorut Cdt


Registrado: 27 Ene 2005Mensajes: 7Ubicación: Barranquilla, Atlántico; Colombia
|
Publicado: Jue 22 Jun, 2006 4:28 pm Asunto: |
|
|
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
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 23 Jun, 2006 1:05 am Asunto: |
|
|
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... _________________
 |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Sab 11 Abr, 2009 5:07 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 11 Abr, 2009 7:16 pm Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|