Ver Mensaje Individual
  #4  
Antiguo 17-10-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Sigo liado con este asunto. Finalmente, parece que he conseguido algo que funciona relativamente bien. Me he limitado a copiar y pegar cierto código de Remy Lebeau, para qué vamos a engañarnos. Yo creo comprender "el conceto", pero, no soy capaz de implementar una solución por mí mismo. Ahora bien, el caso es que parece que ahora sí puedo enviar y recibir grandes cadenas de texto, de hecho cadenas de texto de más de 100 MB...

Aunque realmente esto no ha solucionado mi problema (porque mi proyecto es una DLL que funciona en una aplicación de terceros, y, aunque yo consigo enviar estas grandes cadenas de texto en la aplicación de Delphi que uso para las pruebas, el mismo código no funciona de la misma manera en dicha DLL -cuelga la aplicación si se envían digamos que más de 200 KB) me gustaría que echárais un vistazo a la aplicación de pruebas hecha en Delphi.

El objetivo de subir dicha aplicación de pruebas aquí es, sobre todo, que podáis echar un vistazo a dos métodos en particular:

1º TMainForm.SendFromClientButtonClick()

2º TMainForm.ServerClientRead()

El primer método envía la cadena de texto, teniendo en cuenta que acaso no pueda hacerse de una vez. Al mismo tiempo envía la cadena añadiendo al final de esta una especie de "token" (los caracteres #6#7) que después utilizaremos en el segundo método, de manera que podamos "leer" hasta llegar al final de la cadena, identificado por dichos caracteres.

Me interesa de veras que echéis un vistazo y acaso podáis decirme si existe alguna forma de mejorar dichos métodos, puesto que de este modo pueda lograr que dicho código fuente en mi proyecto de mejor manera. Me preocupa especialmente la siguiente línea del primer método:

Código Delphi [-]
sent := Client.Socket.SendBuf( Pointer(s)^, Length(s) - idx);

En efecto, el código original de Remy era tal que así:

Código Delphi [-]
sent := Client.Socket.SendBuf(PChar(s)+idx, Length(s)-idx);

Sin embargo, si dejo dicho código tal cual se produce el error:

Código:
[DCC Error] UMainForm.pas(225): E2197 Constant object cannot be passed as var parameter
Así que en mi ignorancia he hecho los cambios que se ven arriba, pensando que acaso se tratara de un error de Remy (no realmente un error, pero, tal vez él estaba escribiendo dicho código sin comprobarlo). El caso es que, como he dicho, el código parece funcionar bien (con el cambio que yo he introducido) y lo que quisiera es ver si se está haciendo alguna barbaridad o se encuentra forma de mejorarlo.

Para probar la aplicación que adjunto no tenéis sino compilarla y ejecutarla dos veces: la misma aplicación puede hacer de servidor y de cliente. Así que escoger la instancia que hará de servidor y hacer clic en el botón "Active the server". A continuación, en la otra instancia del programa clic en el botón "Connect to the server".

Hecho eso ya podréis hacer clic (también en esta última instancia, la que hacer de cliente) en el botón "Send from client". Si os fijáis lo que hago es leer un determinado archivo de texto (a.txt) y mandar su contenido al servidor. Este a su vez tomará dicho texto y lo guardará en un archivo de nombre "b.txt". Ambos archivos deben ser al final iguales.

Podéis probar a aumentar el tamaño del archivo "a.txt", simplemente, añadiendo más texto al mismo, para ver hasta dónde es capaz el programa. Y, como digo, sobre todo, acaso alguien pueda darme alguna indicación para mejorar los dos métodos que he mencionado arriba, y que resumen el problema de enviar y recibir grandes cantidades de texto mediante "sockets" TCP.

Por favor, no dejéis de comentar cualquier problema (puedo enviaros los binarios del programa si queréis) y/o si necesitáis más información o cualquier otra cosa.

Muchas gracias.
Archivos Adjuntos
Tipo de Archivo: zip TCPTest.zip (8,5 KB, 23 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 17-10-2013 a las 22:15:56.
Responder Con Cita