Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: N3Tw0lf en 14 Mayo 2011, 07:07 am



Título: Problema: delphi, socket y envios de archivos
Publicado por: N3Tw0lf en 14 Mayo 2011, 07:07 am
Hola muy buenas gente este es mi primer post en el foro espero que me puedan ayudar (: .
tengo este codigo que sirve para que mi cliente socket en delphi reciba un archivo lo entiendo poco, pero igualmente funciona bien con archivos de texto. Se trata de una conexion con de socket normal que trae delphi , el servidor recibe bien archivos de texto (.txt) pero el problema lo tengo cuando quiero mandar un ejecutable, el servidor lo recibe pero vacio :s osea 0 kb  la verdad no tengo la menor idea de cual puede ser el problema alguien me podria dar una mano? en cual es el error o el problema? se lo agradeceria mucho ya que estoy estancado en mi programa por este problema :s les dejo el codigo:
Código
  1. procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  2.  Socket: TCustomWinSocket);
  3. var
  4.  size: Integer;
  5.  strcom, com:string;
  6.  nreceived,i:integer;
  7.  Stream:  TMemoryStream;
  8.  buffer: array  [0..99999] of char;
  9. begin
  10. strcom:=Socket.ReceiveText;
  11. if pos('TOMA',strcom)=1 then
  12.  begin
  13.        Stream := TMemoryStream.Create;
  14.        Screen.Cursor := crHourglass;
  15.        try
  16.          while True do
  17.          begin
  18.            nReceived := Socket.ReceiveBuf (Buffer, sizeof (Buffer));
  19.            if nReceived <= 0 then
  20.              Break
  21.            else
  22.              Stream.Write (Buffer, nReceived);
  23.            Sleep (200);
  24.          end;
  25.          Stream.Position := 0;
  26.          stream.SaveToFile('C:\Prueba.txt');
  27.        finally
  28.          Stream.Free;
  29.          Screen.Cursor := crDefault;
  30.        end;
  31.  end;
Bueno espero que alguien me pueda ayudar
gracias y saludos



Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: Khronos14 en 14 Mayo 2011, 11:05 am
Por lo que veo en tu código haces cosas poco recomendable.

Un bucle infinito sin sentido, la condición que usas para el break la puedes usar para salir del bucle. El sleep no pinta nada, y la rutina como no se ejecuta en un thread te falta un Application.ProcessMessages dentro del bucle para que no se te congele la aplicación.

Deberías poner el código del socket que envía el archivo.

Saludos.


Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: N3Tw0lf en 14 Mayo 2011, 20:59 pm
Hola, antes que nada muchas gracias por responder ,al fin alguien me puede dar una ayuda ;-), bueno la vdad no tengo la menor idea de como manejar esto de enviar y recibir archivos por socket el codigo lo saque de otro foro y fui trantando de entenderlo ejecutandolo varias veces y cambiandole algunas cosas. Te dejo el codigo que envia el archivo:
Código
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. strm:TMemoryStream;
  4. begin
  5. strm:=TMemorystream.Create;
  6. strm.LoadFromFile('C:\Pruebaa.txt');
  7. clientsocket1.Socket.SendText('TOMA');
  8. clientsocket1.socket.SendStream(strm);
  9. end;
  10.  
Teniendo el archivo una extension .txt el code transporta el archivo bien sin ningun error pero cuando intento combiar la extension a .exe (un ejecutable) el archivo se crea pero vacio.

Bueno espero que me puedas ayudar
saludos.



Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: Khronos14 en 14 Mayo 2011, 22:33 pm
¿Que versión de Delphi estás utilizando? Porque si tu versión de Delphi tiene UNICODE hay que hacerlo de una forma u otra, ya que las variables string, char y pchar tienen un valor distinto.

Saludos.


Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: N3Tw0lf en 14 Mayo 2011, 23:09 pm
Delphi 7 ,perdona por no poner todos los datos  :-\,

Saludos


Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: d(-_-)b en 15 Mayo 2011, 01:15 am
talvez mi respuesta no resuelva tu probema, pero por si a caso...

Te recomiendo este interesante material.

Windows Socket Programming using the WinSock API

ttp://www.felix-colibri.com/papers/web/socket_programming/socket_programming.html

A mi personalmente los componentes indy nunca me han gustado.

No hay nada mejor que usar la API

aqui puedes encontrar mucho material http://www.delphibasics.info/

suerte.

saludos...


Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: N3Tw0lf en 15 Mayo 2011, 02:01 am
Hola , muchas gracias por interesarte, el primer enlace lo conocia y esta bueno, el segundo enlace no me sirvio de mucho, igual te lo agradezco nuevamente, concordamos en algo por lo menos jeje a mi tampoco me gustan las indy :P. hay >_< espero que alguien me pueda ayudar por que ya ase mas de una semana estoy tratando de buscar la respuesta a mi problema u.u

Espero mas respuestas por favor

Saludos.


Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: Khronos14 en 17 Mayo 2011, 00:55 am
El principal problema está en la función SendStream, que no envía archivos mayores que 8192 bytes, no se porqué. La solución es hacer un pequeño algoritmo para que lea del fichero y a la vez los mande por un socket.

Código
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.  Dialogs, ScktComp, StdCtrls;
  8.  
  9. type
  10.  TFMain = class(TForm)
  11.    ClientSocket1: TClientSocket;
  12.    ServerSocket1: TServerSocket;
  13.    Button1: TButton;
  14.    procedure FormCreate(Sender: TObject);
  15.    procedure Button1Click(Sender: TObject);
  16.    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  17.    procedure FormDestroy(Sender: TObject);
  18.  private
  19.    { Private declarations }
  20.  public
  21.    { Public declarations }
  22.  end;
  23.  
  24. var
  25.  FMain: TFMain;
  26.  fsToReceive: TFileStream;
  27.  
  28. implementation
  29.  
  30. {$R *.dfm}
  31.  
  32. procedure TFMain.Button1Click(Sender: TObject);
  33. var
  34. Buff: array [0..1023] of byte;
  35. BytesRead: integer;
  36. fsToSend: TFileStream;
  37. begin
  38.  try
  39.    fsToSend:= TFileStream.Create('C:\prueba.mp3', fmOpenRead or fmShareDenyWrite);
  40.    fsToSend.Seek(0, 0);
  41.  
  42.    repeat
  43.      FillChar(Buff, 1024, 0);
  44.      BytesRead:= fsToSend.Read(Buff, 1024);
  45.      Application.ProcessMessages;
  46.      if BytesRead > 0 then
  47.        ServerSocket1.Socket.Connections[0].SendBuf(Buff, SizeOf(Buff));
  48.    until fsToSend.Position = fsToSend.Size;
  49.  
  50.  finally
  51.    fsToSend.Free;
  52.  end;
  53. end;
  54.  
  55. procedure TFMain.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  56. var
  57. BytesRead: integer;
  58. Buff: array [0..1023] of byte;
  59. begin
  60.  if Assigned(fsToReceive) = false then
  61.    fsToReceive:= TFileStream.Create('C:\recibido.mp3', fmCreate or fmOpenReadWrite);
  62.  
  63.  FillChar(Buff, 1024, 0);
  64.  BytesRead:= Socket.ReceiveBuf(Buff, 1024);
  65.  fsToReceive.Write(Buff, BytesRead);
  66. end;
  67.  
  68. procedure TFMain.FormCreate(Sender: TObject);
  69. begin
  70.  try
  71.    ServerSocket1.Active:= True;
  72.    ClientSocket1.Active:= True;
  73.  Except on Exception do
  74.    raise Exception.Create('Ocurrió con el servidor o con el cliente');
  75.  end;
  76. end;
  77.  
  78. procedure TFMain.FormDestroy(Sender: TObject);
  79. begin
  80.  if Assigned(fsToReceive) then
  81.    fsToReceive.Free;
  82. end;
  83.  
  84. end.
  85.  
  86.  

Aquí la prueba la hice enviando desde el servidor, pero sería lo mismo desde el cliente.

Saludos.


Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: N3Tw0lf en 17 Mayo 2011, 05:29 am
Primero que nada muchas gracias la verdad, pense que nadie se iba a interesar en esto gracias de verdad.

Ahora tengo el problema que no me manda nada es como si nunca leyera nada el socket :huh: la verdad no se, tenia una duda que plantearte en tu codigo no usaste el envio de texto antes que los datos, es por algo en especial? no se necesita identificar lo envio con un texto clave? bueno voy a seguir probando con tu codigo tal vez es una falla mia cualquier cosa vuelvo a preguntar en este mismo post

Muchas gracias de verdad

Saludos

EDITO:
Lo volvi a hacer todo desde el principio las aplicaciones me llegan incompletas  :-( y al querer ejecutarlas me aparece Error el archivo no es una aplicacion WIN32

al compararla con el tamaño del original faltan mas de la mitad de los kb del mismo :s. Disculpame que te joda tanto posta me estas dando una re mano con esto espero que me puedas ayudar a terminarlo

Gracias y saludos




Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: Khronos14 en 17 Mayo 2011, 17:38 pm
El código que te puse a mi me funciona perfectamente. En el Form solo tengo un botón, un TClientSocket y un TServerSocket.

Saludos.


Título: Re: Problema: delphi, socket y envios de archivos
Publicado por: N3Tw0lf en 17 Mayo 2011, 23:34 pm
Te molestaria mucho mandarme el ejemplo por favor.      O ponerme un link de donde descargarlo ? . Te llego el mensaje que te mande?


Muchas gracias y disculpa las molestias

Saludos. :D