Implementar servicio de red

30/07/2003 - 09:42 por Mario | Informe spam
Hola a todos/as;

Tengo un desarrollo de un servicio de red y me surgen alguna dudas, que
espero podaís orientamerme.

Dicho servicio de red consistiría en la escucha de peticiones de unos 200
clientes de manera aleatoria (es decir, no secuenciales), sobre TCP y un
puerto lógico determinado (pongamos 38000).

A partir de ahí los clientes realizarían peticiones de conexión, se
establecerían y se procedería al intercambio de datos entre el cliente y el
servidor.

Es decir, es el cliente quién comienza la comunicación y el servidor debe
ser capaz de establecer conexión con cada uno de manera asíncrona e
intercambiar datos.

A partir de esta pequeña introducción las dudas puntuales en referencia a la
programación de la aplicación de servidor (escucha).

1)
Había pensado en realizar programar un servicio, también necesitaría poder
añadir una interfaz gráfica para poder monitorizar conexiones concurrentes,
flujos de datos, etc.
¿Es posible insertar parte GUI en una aplicación tipo servicio?

2)
El servicio deberá atender y trabar de modo asíncrono, es decir, establecer
un hilo de ejecución por cada petición de los clientes, procesar en seguno
plano esa petición, pero poder atender siempre las nuevas peticiones a dicho
pueto.
Por lo que he examinado de programación con sockets en .Net, sería cuestión
de utilizar un socket de servicor asíncrono, no?
A este punto agradecerá cualquier sugerencia u orientación

3)
Por temas de robustez, debería poder controlar cuando se ha perdido una
conexión con un cliente (evento) para suspender y eliminar dicho subproceso
lo antes posible.

4)
En principio no atenderá a un número excesivo de clientes, pero debería ser
escalable sin problemas.
¿Sería interesante en este punto, interactuar con COM+ de alguna manera para
optimizar el redimiento?

5)
Para finalizar y por temas de seguridad, debería implementar un mecanismo
que no permitiera un desbordamiento de peticiones desde un mismo cliente en
principio.
Es decir, no aceptar más de una petición y/o establecimiento de conexión de
un mismo cliente. (cómo mínimo sin cerrar la que pudiera tener abierta).
¿Sugerencias a este punto teniendo en cuenta lo explicado hasta ahora?


Si habeís llegado hasta aquí os doy las gracias por vuestro tiempo y
atención, esperando ansioso vuestras sugerencias de cualquier tipo.

Saludos
Mario Garralda

Preguntas similare

Leer las respuestas

#1 Mario
30/07/2003 - 09:46 | Informe spam
Se me olvido en el anterior mensaje.
Dicho servicio también interactuará con un SQL-Sever donde consultará
información, y agregará datos.

A este punto el planteamiento sería que cada subproceso generé sun conexión
(en principio utilizaría el tema del pool de conexiones) y actulice datos
o por el contrario sería conveniente una instancia de conexión común a todos
los subprocesos.

Gracias de nuevo.
Respuesta Responder a este mensaje
#2 Rodrigo Corral González
30/07/2003 - 11:00 | Informe spam
Hola!!!!

Lee entre lineas...

Hola a todos/as;

Tengo un desarrollo de un servicio de red y me surgen alguna dudas, que
espero podaís orientamerme.

Dicho servicio de red consistiría en la escucha de peticiones de unos 200
clientes de manera aleatoria (es decir, no secuenciales), sobre TCP y un
puerto lógico determinado (pongamos 38000).

A partir de ahí los clientes realizarían peticiones de conexión, se
establecerían y se procedería al intercambio de datos entre el cliente y el
servidor.

Es decir, es el cliente quién comienza la comunicación y el servidor debe
ser capaz de establecer conexión con cada uno de manera asíncrona e
intercambiar datos.

A partir de esta pequeña introducción las dudas puntuales en referencia a la
programación de la aplicación de servidor (escucha).

1)
Había pensado en realizar programar un servicio, también necesitaría poder
añadir una interfaz gráfica para poder monitorizar conexiones concurrentes,
flujos de datos, etc.
¿Es posible insertar parte GUI en una aplicación tipo servicio?



Si puedes, pero no debes. Lo ideal seria que tu servicio expusiese una
serie de objetos a través de .Net Remoting, de manera que puedas
administrar el servicio a través de ellos.

2)
El servicio deberá atender y trabar de modo asíncrono, es decir, establecer
un hilo de ejecución por cada petición de los clientes, procesar en seguno
plano esa petición, pero poder atender siempre las nuevas peticiones a dicho
pueto.
Por lo que he examinado de programación con sockets en .Net, sería cuestión
de utilizar un socket de servicor asíncrono, no?
A este punto agradecerá cualquier sugerencia u orientación



Sin duda la combinación de sockets asincronos y pool de hilos te dara
el mayor rendimiento y escalabilidad. El articulo siguiente te puede ayudar:

http://www.devhood.com/tutorials/tu...orial_idp9
3)
Por temas de robustez, debería poder controlar cuando se ha perdido una
conexión con un cliente (evento) para suspender y eliminar dicho subproceso
lo antes posible.



No necesitas manejar esta situación de manera explicita. Cuando un
cliente cierre la conexión se liberan (en realidad se devuelven al tool)
automaticamente los hilos que la estaban atendiendo. Es posible que
necesites asegurar que has recibido los datos completos, finalizando el
stream de datos con algun marcador especial, por ejemplo <EOF>.

4)
En principio no atenderá a un número excesivo de clientes, pero debería ser
escalable sin problemas.
¿Sería interesante en este punto, interactuar con COM+ de alguna manera para
optimizar el redimiento?



COM+ no te aporta nada en cuanto a escalabilidad. Usando pool de hilos
y pool de conexiones a BD tendrias escalabilidad más que suficiente.


5)
Para finalizar y por temas de seguridad, debería implementar un mecanismo
que no permitiera un desbordamiento de peticiones desde un mismo cliente en
principio.
Es decir, no aceptar más de una petición y/o establecimiento de conexión de
un mismo cliente. (cómo mínimo sin cerrar la que pudiera tener abierta).
¿Sugerencias a este punto teniendo en cuenta lo explicado hasta ahora?



Podrias controlar el numero de conexiones concurrentes desde una misma
ip. Esto podria dar problemas con clientes que accediesen a través de un
proxy, lo ideal seria que tubieses un valor de clientes por ip por
defecto, pero que puedieses cambiarlo para una lista determinada de ips,
que guardases en una tabla o en un archivo de configuración.

Si habeís llegado hasta aquí os doy las gracias por vuestro tiempo y
atención, esperando ansioso vuestras sugerencias de cualquier tipo.

Saludos
Mario Garralda



Respuesta Responder a este mensaje
#3 Hernan Foffani
30/07/2003 - 12:38 | Informe spam
El punto de la seguridad que comentas en principio, el
tema del proxy no es problema, ya, que las Ip (clientes)
que accederán al servicio estarán
previamente autenticados con un servidor Radius, con lo
cual el acceso digamos, que no es anónimo.
Pero sin es necesario que desde esas IP, no se produzca
un ataque de peticiones masivo.



evitaría tratar de controlar ataques DDS desde la
aplicación especialmente si las estaciones de trabajo
clientes no son seguras. casi, casi eso te saldrá mas
caro que hacer el resto de aplicación.

¿tienes cortafuegos? revisa sus capacidades. es mucho lo
que puede hacer desde allí.

En cuanto el tema de controlar el servicio a traves
de .Net remoting me gusta la idea (otra cosa será luego
implemntarlo correctamente) :)).



en msdn.microsoft.com hay algunos ejemplos.

saludos,
-Hernan
Respuesta Responder a este mensaje
#4 Rodrigo Corral González
30/07/2003 - 21:13 | Informe spam
Sin duda el pool de conexiones de ADO.NET se comportara mejor o igual que lo
que tu puedas programar y además esta probado por millones de
desarrolladores. Será más que suficiente no te preocupes.

Un saludo.
Rodrigo Corral González
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida