elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Problema: delphi, socket y envios de archivos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema: delphi, socket y envios de archivos  (Leído 9,063 veces)
N3Tw0lf

Desconectado Desconectado

Mensajes: 20


NETwolf


Ver Perfil
Problema: delphi, socket y envios de archivos
« 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



En línea

Experiencia es el nombre que le damos a nuestros errores
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: Problema: delphi, socket y envios de archivos
« Respuesta #1 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.


En línea

N3Tw0lf

Desconectado Desconectado

Mensajes: 20


NETwolf


Ver Perfil
Re: Problema: delphi, socket y envios de archivos
« Respuesta #2 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.

En línea

Experiencia es el nombre que le damos a nuestros errores
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: Problema: delphi, socket y envios de archivos
« Respuesta #3 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.
En línea

N3Tw0lf

Desconectado Desconectado

Mensajes: 20


NETwolf


Ver Perfil
Re: Problema: delphi, socket y envios de archivos
« Respuesta #4 en: 14 Mayo 2011, 23:09 pm »

Delphi 7 ,perdona por no poner todos los datos  :-\,

Saludos
En línea

Experiencia es el nombre que le damos a nuestros errores
d(-_-)b


Desconectado Desconectado

Mensajes: 1.331



Ver Perfil WWW
Re: Problema: delphi, socket y envios de archivos
« Respuesta #5 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...
En línea

Max 400; caracteres restantes: 366
N3Tw0lf

Desconectado Desconectado

Mensajes: 20


NETwolf


Ver Perfil
Re: Problema: delphi, socket y envios de archivos
« Respuesta #6 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.
« Última modificación: 15 Mayo 2011, 02:03 am por N3Tw0lf » En línea

Experiencia es el nombre que le damos a nuestros errores
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: Problema: delphi, socket y envios de archivos
« Respuesta #7 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.
En línea

N3Tw0lf

Desconectado Desconectado

Mensajes: 20


NETwolf


Ver Perfil
Re: Problema: delphi, socket y envios de archivos
« Respuesta #8 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


« Última modificación: 17 Mayo 2011, 05:58 am por N3Tw0lf » En línea

Experiencia es el nombre que le damos a nuestros errores
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: Problema: delphi, socket y envios de archivos
« Respuesta #9 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.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cómo enviar archivos vía socket en java
Java
Nekro_Psycho 0 15,416 Último mensaje 10 Enero 2006, 21:29 pm
por Nekro_Psycho
Desenpaquetar archivos enpaquetados con Borland Delphi 3.0
Software
rin1 1 2,795 Último mensaje 11 Mayo 2011, 02:11 am
por SuperDraco
Socket en delphi y sus manejos
Programación General
N3Tw0lf 3 4,058 Último mensaje 22 Mayo 2011, 14:26 pm
por skapunky
metodo POST delphi INDY reintentar si se produce socket error
Programación General
OssoH 0 1,672 Último mensaje 22 Octubre 2013, 10:22 am
por OssoH
Envios y recibos de caracteres VB .net
.NET (C#, VB.NET, ASP)
Meta 1 2,181 Último mensaje 1 Marzo 2015, 18:08 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines