PDA

Ver la Versión Completa : Transferencia de archivos con Sockets no me deja mas de 32KB!


JuanErasmo
04-06-2007, 17:43:18
Hola amigos,
Estoy usando ClientSocket, y ServerSocket para la transferecia de archivos,
y me funciona muyyyyy bien!
pero, cuando intento enviar un archivo mayor de 32K, me sale el archivo malo al otro lado, es decir, solo llegan 32K, por el numero, se me hace que neesito vaciar un buffer, limpiar algo, o algo asi,,,,,
el codigo de envio es este:
TMemoryStream *archivo = new TMemoryStream;
archivo->Clear();
if (OpenDialog1->Execute()){
archivo->LoadFromFile(OpenDialog1->FileName); // Archivo a Enviar //
}
Byte *byt = new Byte() ;
for (int i=0;i<(archivo->Size);i++){
archivo->Position=i;
archivo->Read(byt,1);
ClientSocket1->Socket->SendBuf(byt,1);
}

delete archivo;

Eso en el cliente, y en el servidor en el evento donde el cliente lee,
esto: cont++;

// RichEdit1->Lines->Add(Socket->ReceiveText());

Socket->ReceiveBuf(bytrec,1); // Tiene que recibir primero el tamaño y el nombre, // // Recibido es otro MemoryStream! funciona perfecto para archivos menores a 32K, pero si se pasa, no funciona.....
Recibido->Write(bytrec,1); // tiene problemas cuando es un tamaño mayor a 32K,




Alguna idea? tiene algo que ver con el buffer del Socket? como lo limpio?
Gracias!

white_zombie
04-06-2007, 20:40:56
Hola, yo normalmente uso el idclientsocket de las indy y este tiene la propiedad de determinar el tamaño derl buffer (sendbuffersize) tanto de lectura como de escritura, predeterminado viene a 32768.

Le he echado un vistazo al componente clientsocket para ver si tenia una propiedad parecida y no la he visto por ningun lado, pero supongo que el problema es que restringe el tamaño del mensaje.

Yo por experiencia te recomiendo los sockets de las indy ya que son mas completos, tendrias que cambiar muy poco codigo y estas tienen la propiedad de determinar el buffer de escritura.

Un saludo.

JuanErasmo
04-06-2007, 22:19:07
Hola!
Gracias por tu respuesta!
lo intentare con las indy.
pero insisto.....hay alguna form ade limpiar el buffer???
Gracias!

white_zombie
04-06-2007, 22:51:01
Lo que necesitas es aumentar el tamaño del buffer no limpiarlo ya que lo quieres es enviar archivos de mas de 32K y lo que creo que te pasa es que el tamaño del buffer esta restringindo a 32K como en las indy con lo cual de que te sirve limpiarlo.

No tengo mucha experiencia con el clientsocket ya que alguna vez que lo usado me ha dado problemas y me he pasado a las Indy, espero que alguno de los experimentados amigos de este foro te pueda ayudar mas que yo.

Un saludo.

JuanErasmo
04-06-2007, 23:26:27
muchas gracias otra vez.

El problema del tamaño es del cliente? o del servidor?

Muchas gracias

white_zombie
05-06-2007, 00:19:09
Basandome en las Indy, el problema es de el cliente.

serebi
10-09-2007, 03:06:01
Que puedo decirte alguna ves hize un programa de transferencia de archivos con soquets no con los indy recuerdo que use streams para mandar archivos de hasta 38 Mb buscare el codigo y lo publicare pero te aseguro que se puede realizar