PDA

Ver la Versión Completa : Sobre el uso de TServerSocket y TClientSocket para conexiones TCP/IP


dec
26-08-2012, 11:33:18
Hola a todos,

Me he decidido por abrir un hilo a ver si alguien puede echarme una mano, contestar algo al respecto, darme alguna idea, etc. Resulta que hace tiempo que vengo dando vueltas a cierto proyecto que trate de establecer conexiones TCP/IP, es decir, en pocas palabras, dicho proyecto o aplicación debería poder actuar como servidor y también como cliente, de manera que pudiera comunicarse con otras aplicaciones.

Me he planteado el asunto no pocas veces, pero, nunca he terminado de concretar nada. Algo importante, aunque, tal vez algo irracional, para mi proyecto, es que la misma aplicación pudiera actuar de servidor y de cliente a la vez, cosa que no he logrado con algunos de los componentes que he tratado de utilizar a lo largo del tiempo en que llevo dando vueltas al tema. Por ejemplo, con los componentes Indy, no he podido lograr este objetivo.

He tratado de utilizar todos los componentes que he ido encontrando, y he probado varios de ellos, también con la intención de no utilizar los componentes Indy u otros paquetes de componentes "grandes", en definitiva, tratando de mantener cierta independencia de mi proyecto respecto de grandes paquetes de componentes, pues, todos sabemos que Indy es mucho más que TCP/IP, afortunadamente, pero, yo preciso sólo esto último.

Pues bien. Resulta que he tenido siempre en mis narices el paquete de componentes "dclsockets.*", que, no viene instalado por defecto en Delphi, a partir de Delphi 6, me parece. No viene instalado por defecto, pero, dicho paquete de componentes se distribuye junto a Delphi, al menos en Delphi 2007 y hasta en Delphi XE2. Estoy hablando de los componentes "TServerSocket" y "TClientSocket", y que, aparentemente, cumplen casi a la perfección con lo que me había planteado en un principio.

Haciendo pruebas, veo que puedo hacer que una aplicación se comporte como servidor y como cliente. Que puedo "instanciar" varios clientes conectándolos al servidor y enviando y recibiendo texto (no Unicode) sin problemas. Además los componentes parecen más o menos sencillos de usar, y, hasta donde he llegado, parecen libres de errores, en el sentido de que su tratamiento también es sencillo y no se producen problemas "raros" o de "desconocida procedencia" para mí.

Creo que me estoy enrrollando demasiado y pido disculpas por ello. Los problemas o preguntas que se me plantean son más o menos las siguientes:

1º ¿Hay algo malo con estos componentes? Quiero decir, que, desaparecieron de la paleta en Delphi 6, aunque siguen estando disponibles, y, no encuentro que la unidad que los contiene en Delphi XE2 los marque como "deprecated" (¿depreciados?) o algo así. Yo he hecho pruebas en Windows 7 y todo parece funcionar bien, como digo, y, a falta de probar en Windows 8, diría que tampoco ahí tendrán problemas.

2º He leído en algunos lugares que dichos componentes hacen uso de ciertas características de Windows que han sido superadas, y, así se recomienda usar Indy, ICS o Synapse, por ejemplo, en lugar de los primeros. Pero considero confuso el uso de TCP/IP mediante los componentes que Indy tiene, o, como he dicho más arriba, preferiría utilizar algo más "sencillo". Por lo demás, ¿cómo es posible que los componentes sobre las "viejas" características de Windows *me* funcionen tan bien?

3º ¿Vosotros usaríais los componentes "TServerSocket" y "TClientSocket"? ¿Los estáis usando? ¿Preferís otros? Me parece curioso que en Delphi vengan de forma predeterminada los componentes "TTcpServer" y "TTcpClient", puesto que, aunque posteriores (si no me equivoco) no he conseguido tan buenos resultados con estos que con aquellos. ¿Me estaré volviendo loco, doctor? ¿Los componentes que se supone tenían que sustituir a los antiguos resultan peores? Pero esto no puede ser... sin duda el problema soy yo y no otra cosa.

En definitiva, a ver si podéis echarme una mano en este asunto. Todavía me quedaría encontrar la forma de enviar texto "unicode" con los componentes susomentados, aunque, estoy tan entusiasmado con ellos, que, incluso lo daría como una funcionalidad, simplemente, "no disponible" en la aplicación, supuesto que el resto del texto (ASCII) podría ser enviado y recibido sin problemas. Otra cosa sería el envío de archivos, una funcionalidad que se me hace duro dejar como "no disponible", supuesto que he hecho algunas pruebas y no he dado pie con bola.

Y eso es todo. Espero no haberte aburrido demasiado si has llegado hasta aquí. Seguramente tú sepas decirme algo sobre la "historia" que puede haber detrás de "TServerSocket" y "TClientSocket", y hasta de la historia que puede haber delante... cualquier comentario será bienvenido.

¡Muchas gracias!

escafandra
26-08-2012, 18:33:58
Esos componentes lo he usado sin problemas. Si en la documentación aparecen como obsoletos es porque usas la versión Socket 1.1 que está superada. Yo he usado esos componentes en comunicación con WinSock 2.2 en otros ejecutables que sólo usan la API (sin componentes) y funcionan bien.

Ahora que mencionas el tema se me ocurre, pues no lo he probado, actualizar el código fuente de una forma muy sencilla que en principio consistiría en cambiar una instrucción de los constructores:
WSAStartup($0101, WSAData);
por
WSAStartup(MakeWord(2, 2), WSAData);
En concreto sería cambiarlo en el procedimiento Startup de ScktComp.pas:

procedure Startup;
var
ErrorCode: Integer;
begin
ErrorCode := WSAStartup(MakeWord(2, 2), WSAData); //WSAStartup($0101, WSAData);
if ErrorCode <> 0 then
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(ErrorCode), ErrorCode, 'WSAStartup']);
end;


Habría que revisar muchas mas cosas, pero para empezar...

Así que, si te animas, realiza el cambio y recompila los componentes; prueba y me cuentas...


Saludos.

dec
26-08-2012, 19:11:14
Hola,

¡Muchas gracias por responder tan rápido además! La verdad es que no me he resistido y he estado haciendo pruebas y hasta adelantando el proyecto de que he hablado, todo sin problemas, a falta de probar realmente el servidor y el cliente, esto es, desde otro ordenador diferente al mío. Yo creo que voy a terminar usando estos componentes por varias razones, algunas de ellas ya mencionadas arriba, pero, me alegra experiencia, que aporta un poco de luz al tema.

Y hablando de tu experiencia y tu propuesta. En efecto, el procedimiento "Startup" es tal como dices, tanto en Delphi 2007 como en Delphi XE2. Ahora bien, se me ocurren dos cosas. En primer lugar, ¿es posible modificar dicho código sin más? Al fin y al cabo está bajo copyright the Embarcadero. Pero, además, ¿realmente haría falta? Me explico. ¿No se usará la última versión de Winsock, incluso si se especifica que no sea así? ¿Entonces porqué funcionan tan bien? ¿Y en Windows 7 nada menos? ¿No puede ser la versión 1 aquí una especie de "wrapper" que termine usando la nueva versión?

En fin. Gracias de nuevo por contestar. Y que se anime quien quiera a comentar cualquier otra cosa: todas ellas serán bienvenidas. ;)

dec
26-08-2012, 20:00:42
Hola de nuevo,

Entre otras cosas, en la documentación que enlacé en mi anterior mensaje (http://msdn.microsoft.com/en-us/library/windows/desktop/ms742213%28v=vs.85%29.aspx), puede leerse esto:


The current version of the Windows Sockets specification is version 2.2. The current Winsock DLL, Ws2_32.dll, supports applications that request any of the following versions of Windows Sockets specification:

1.0
1.1
2.0
2.1
2.2


Aunque mi inglés es pésimo, yo entiendo que, aunque tú solicites usar la versión 1.1, por ejemplo, lo que en realidad ocurre, si existe una versión superior, es que se usará esta versión superior, pues soporta la "interfaz" de la versión anterior. Y ahí es donde digo que pueden haberse solucionado los problemas que menciona el compañero más arriba, en el sentido de que dichos problemas acaso se dieran sólo en la versión 1.1 (por ejemplo), pero, esta sólo se usará donde no se disponga de otra cosa, y eso será raro, pues, desde Windows 95, parece ser, se incluye la versión 2.2... ¿estoy equivocado o esto puede ser más o menos así?

escafandra
26-08-2012, 20:29:42
Yo lo que entiendo es que es compatibles hacia atrás...

WinSock 2.2 añade mas funcionalidades y funciones pero quizás para tu propósito no sea necesario: Windows Sockets 2 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740673(v=vs.85).aspx)


Saludos.

dec
26-08-2012, 21:48:47
Hola,

Eso digo, escafandra, que, aunque yo "cargue" la versión 1.0, terminará usándose la versión que esté instalada (la 2.2 es la última y será la probablemente instalada), siendo que, los posibles problemas detectados en la versión 1.0, no afectarán al programa, pues al final se acabará usando la versión 2.2 de WinSock. El caso es que, con sus limitaciones (de momento sin texto Unicode y hasta sin enviar archivos) me parecen dos componentes excelentes por su buen resultado y hasta diría que eficacia.

Lo digo teniendo en cuenta los problemas que he encontrado cuando he tratado de usar otros componentes (que no han sido pocos), aunque, para decir toda la verdad, no pocos de estos problemas, seguramente, puedan achacárseme a mí. En este caso, me limitaré a decir que estos componentes me parecen realmente sencillos de usar (los puedo usar hasta yo) y prácticos, a mi parecer, siempre que se necesite conectar clientes con servidores y viceversa. ¿Eh? ;)

escafandra
27-08-2012, 00:56:39
Bueno. con los sockets puedes enviar y recibir cualquier cosa, no sólo texto. Puedes hacerte funciones para enviar y recibir ficheros, pero si te apetece algo hecho puedes usar la API TransmitFile (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740565(v=vs.85).aspx)


Saludos.

dec
27-08-2012, 03:09:20
Bueno. con los sockets puedes enviar y recibir cualquier cosa, no sólo texto. Puedes hacerte funciones para enviar y recibir ficheros, pero si te apetece algo hecho puedes usar la API TransmitFile (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740565(v=vs.85).aspx)


Saludos.

Echaré un vistazo. Muchas gracias otra vez escafandra, de veras me has dado el empujón que me faltaba para confiar en estos componentes. ;)

dec
27-08-2012, 23:08:44
Hola,

Quiero añadir que Casimiro y Caral me han echado una mano y hemos podido conectar nuestros ordenadores y mantener una conversión (tal que con el Messenger) sin problema alguno. ¡Muchas gracias a todos! ;)