Ir al contenido


Foto

Conversión de c++ a Delphi


  • Por favor identifícate para responder
14 respuestas en este tema

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 06 marzo 2012 - 02:43

Hola amigos

tengo éste código


cpp
  1. while ((nbytes = read(fd,lon_buf,1024)) > 0)
  2.   {
  3.     enviado = write(sfd,lon_buf,nbytes);
  4.   }


Cual sería su equivalencia.

Hice esto pero no lo acepta el compilador


delphi
  1. while (uBytes := _lread(hFile, @Buffer, 1024) > 0) do
  2. begin
  3.   send(hSocket, Buffer, uBytes), 0);
  4. end;


[DCC Error] Unit1.pas(161): E2029 ')' expected but ':=' found


Alguna idea de como debe ser ? o de plano Delphi no acepta ese tipo de comparaciones ¿?

Lo tengo resuelto de otra forma con un repeat-until, pero viendo las notas del proyecto, vi esa forma de enviar datos a través de sockets y pensé en reproducirla tal cual. :)

Saludos
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 06 marzo 2012 - 03:19

Veo dos cosas en ese código C:

1- En primer lugar y lo mas importante, el While tiene una asignación y una comparación unidas. C lo permite pero delphi no. Es una sintaxis muy cómoda para casos como este.

2- Casi puedo asegurar que el write, a falta de saber los tipos de los parámetros, es una escritura en fichero y se traduce a la API _lwrite.


Una adaptación al delphi, según interpreto ese código (ya digo, a falta de conocer los tipos de los parámetros) sería esta:


delphi
  1.   uBytes = _lread(hFile, @Buffer, 1024);
  2.   while uBytes > 0 do
  3.   begin
  4.       enviado:= _lwrite(hFile2, @Buffer, uBytes);
  5.       uBytes:= _lread(hFile, @Buffer, 1024)
  6.   end;


Dado que cuando uBytes sea 0 _lwrite no va a escribir nada, el código debería funcionar de esta otra forma mas simple:

delphi
  1.   repeat
  2.       uBytes:= _lread(hFile, @Buffer, 1024);
  3.       enviado:= _lwrite(hFile2, @Buffer, uBytes);
  4.   until uBytes = 0;

Para esta segunda forma debes conocer exactamente si write escribe en fichero. En otro caso deberás saber que pasa cuando uBytes sea 0. En caso de que ese write sea una función que envíe el buffer por un socket no cambiaría mucho la cosa, pero asegúrate lo que pasa con uBytes=0 o usa la primera forma.

Espero haberte aclaro las dudas.


Saludos.
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 06 marzo 2012 - 04:09

Gracias amigo escafandra, me lo suponia.

Lo tengo resuelto con esto:


delphi
  1. repeat
  2.   uBytes := send(hSocket, Buffer, _lread(hFile, @Buffer, 1024), 0);
  3. until uBytes < SizeOf(Buffer);


Pero quería ver si se podía hacer la traducción literal de c++ a delphi :)

Saludos
 
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 06 marzo 2012 - 04:23

Veo que esa función write escribía en un socket. La traducción literal no es posible pero si varias buenas opciones.

En alguna ocasión he tenido problemas al enviar por un socket tamaños grandes de buffer en una sola función send. Vigila ese punto aunque con un buffer en porciones de 1024 no creo que tengas problemas.


Saludos.
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 06 marzo 2012 - 04:44

Veo que esa función write escribía en un socket. La traducción literal no es posible pero si varias buenas opciones.

En alguna ocasión he tenido problemas al enviar por un socket tamaños grandes de buffer en una sola función send. Vigila ese punto aunque con un buffer en porciones de 1024 no creo que tengas problemas.


Saludos.


Fijate que si tengo problemas pero no me han dicho el porque me regresan "Error en cadena", ya he hecho mis pruebas localmente y todo pasa correctamente, el archivo recibido es una copia exacta del archivo enviado. Los tamaños son exactamente los mismos. Por eso pensé en traducir el ejemplo que me dieron de c++.

Tendré que esperar a que me indiquen el porque no reconocen lo que les estoy enviando, si son archivos pequeños lo validan correctamente, pero archivos grandes no. Pensé en la velocidad de envío y le he puesto un dato entero con un sleep() para verificar si es por eso.

En fin, tendré que esperar que me digan el porque no lo reciben bien.

Muchas gracias.

Saludos
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 06 marzo 2012 - 05:41

Fijate que si tengo problemas...

...si son archivos pequeños lo validan correctamente, pero archivos grandes no...


Ese problema tuve una vez. Se presentaba cuando en el send colocaba tamaños de buffer grandes. En envío se ralentizaba mucho, así que opté por enviar bloques pequeños con una confirmación al final de cada bloque que consistía en devolverme el número de bites recibidos en el PC remoto para una vez que coincidía con los enviados continuar con el siguiente bloque. De esta forma el sistema funcionó bien y a una velocidad aceptable. Claro que esto implica diseñar el protocolo en los dos lados, cliente y servidor.


Saludos.
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 07 marzo 2012 - 08:26


Fijate que si tengo problemas...

...si son archivos pequeños lo validan correctamente, pero archivos grandes no...


Ese problema tuve una vez. Se presentaba cuando en el send colocaba tamaños de buffer grandes. En envío se ralentizaba mucho, así que opté por enviar bloques pequeños con una confirmación al final de cada bloque que consistía en devolverme el número de bites recibidos en el PC remoto para una vez que coincidía con los enviados continuar con el siguiente bloque. De esta forma el sistema funcionó bien y a una velocidad aceptable. Claro que esto implica diseñar el protocolo en los dos lados, cliente y servidor.


Saludos.


Lamentablemente no es el caso, quien tiene el lado server no hace cambios, lo únicoi que me queda es que me indiquen donde está el error para ajustarlo :)

Saludos y gracias
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 12 marzo 2012 - 08:56

Hola,

Esto en c++


cpp
  1.   (void) signal(SIGCLD, SIG_IGN);
  2.   (void) signal(SIGHUP, SIG_IGN);
  3.   (void) signal(SIGINT, SIG_IGN);


Cual es su "equivalencia" en Delphi, he leído sobre estas instrucciones y hablan de zombies, pero no logro comprender que hacen realmente.

Saludos
  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 12 marzo 2012 - 02:08

Creo que va mas enfocado a sistemas Unix y Linux.

Signal es de la librería estandar de C. No sabría decirte como hacerlo en delphi salvo haciendo un truco importando la función C desde dll crtdll.dll:


delphi
  1. procedure signal(sig: integer; f: Pointer); cdecl external 'crtdll';

No lo he probado, haz tú las pruebas.


Saludos.
  • 0

#10 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 12 marzo 2012 - 02:43

Cual es su "equivalencia" en Delphi, he leído sobre estas instrucciones y hablan de zombies, pero no logro comprender que hacen realmente.


:s Zombies !!!




PD: Si no estas en linux olvidate de los zombies, y mejor piensa en threads ¿que es lo que intentas hacer?
  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 12 marzo 2012 - 03:03


Cual es su "equivalencia" en Delphi, he leído sobre estas instrucciones y hablan de zombies, pero no logro comprender que hacen realmente.


:s Zombies !!!

PD: Si no estas en linux olvidate de los zombies, y mejor piensa en threads ¿que es lo que intentas hacer?


Intento "traducir" un programa hecho en C++ (y que está funcionando bien en linux) a Delphi que está a la escucha de datos recibidos a través de sockets, éste programa lo he hecho con el componente TServerSocket y funciona digamos bien, pero de vez en cuando envía un error de sincronía.

Y pues quiero saber que hace cada función que no conozco (casi todo :D :D :D) para entender lo que hace ese programa. :)

Saludos


  • 0

#12 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 13 marzo 2012 - 01:22

Pues sin ver el código, me atrevo a aventurar que el programa utiliza la instrucción "fork" para crear un proceso nuevo por cada nueva conexión entrante. La instrucción "fork" crea un duplicado exacto de nuestro proceso, es decir en el momento de ejecutar la sentencia se crea un proceso exactamente igual al que se esta ejecutando en ese momento, con la misma variables y en el mismo punto de ejecución y a partir de ahí cada uno va por un camino diferente.

Seguramente el código declare un "manejador de señales" (algo asi como el bucle de mensajes en windows) para saber cuando termina cada proceso, y asi poder limpiar todos los procesos "hijos" de tal manera que estos no queden "zombies".

Pero como ya te dije esto es en linux, donde no hay threads pero si hay zombies  :s En windows se deben de utilizar threads, que nos permiten tener distintos hilos de ejecución dentro de un mismo proceso.

Ejemplo de servidor hecho en C usando "fork" para linux:
http://delphi.jmrds.com/?q=node/14

Y lo mismo hecho en Delphi usando threads para windows:
http://delphi.jmrds.com/?q=node/15
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 13 marzo 2012 - 08:46

Asi es, en efecto, usan esa función fork(), como es que lo intuyen tan facil y yo no :(

Estoy viendo tu ejemplo y me parece que es lo que necesito, bueno, habrá que hacer pequeñas modificaciones para que realice los eventos dependiendo de lo que se recibe.

Gracias amigo seoane, (y)

Saludos
  • 0

#14 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 13 marzo 2012 - 01:59

Asi es, en efecto, usan esa función fork(), como es que lo intuyen tan facil y yo no :(


Porque yo he jugado un poquito (muy poco) con C sobre linux y me imagino que para ti es la primera vez que lo ves.

Estoy viendo tu ejemplo y me parece que es lo que necesito, bueno, habrá que hacer pequeñas modificaciones para que realice los eventos dependiendo de lo que se recibe.


Fíjate en que el ejemplo es un servidor web, aunque si lo que vas a recibir y enviar son lineas de texto supongo que lo puedes adaptar fácilmente.

Puede que, por motivos de trabajo, tenga que volver a meterme en tema de sockets. Si es así espero que me ayudéis a depurar el código, incluso puede que nos podamos ayudar mutuamente.

Saludos
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 13 marzo 2012 - 02:33

Porque yo he jugado un poquito (muy poco) con C sobre linux y me imagino que para ti es la primera vez que lo ves.


Asi es nunca me he metido a Unix ni a Linux más allá de código awk.

Fíjate en que el ejemplo es un servidor web, aunque si lo que vas a recibir y enviar son lineas de texto supongo que lo puedes adaptar fácilmente.

Puede que, por motivos de trabajo, tenga que volver a meterme en tema de sockets. Si es así espero que me ayudéis a depurar el código, incluso puede que nos podamos ayudar mutuamente.

Saludos


Fiijate que me interesa mucho ya que el proyecto que tengo es recibir de varios puntos archivos y puede ser el caso de varios simultáneos y es para ayer jajajaja, como siempre :)

Hoy probé tu servidor de internet y me pareció genial, pareciera un FTP sin instalar nada, fué muy interesante ver su funcionamiento :)

Voy a intentar adaptar tu idea y en el camino te pediré ayuda :), la única diferencia es que a mi me gusta ser más visual y tu eres mucho de consola jejeje.

Ya abriré un hilo para desarrollar la idea, por ahora conceptualizaré bien el proyecto :)

Saludos
  • 0




IP.Board spam blocked by CleanTalk.