Detección de múltiples clientes/servidores en C#

Estoy desarrollando un programa de múltiples clientes/ múltiples servidores en C#, y antes de llegar al meollo del asunto, me preguntaba si alguien había trabajado alguna vez en un proyecto similar y podría compartir sus consejos/ideas para la implementación.

  • Los servidores se ubicarán en muchas PC y escucharán las conexiones entrantes de los clientes (¿O deberían los servidores transmitir y los clientes escuchar?).
  • Cuando se inicia un cliente, debe completar automáticamente una lista de posibles direcciones IP del servidor.
  • Cuando un servidor se cierra, el cliente debe eliminar ese servidor de su lista.
  • Cuando se inicia un nuevo servidor, se debe notificar a los clientes y agregarlo a su lista.
  • Un servidor también puede actuar como cliente y debería poder verse a sí mismo, así como a todos los demás servidores.
  • Un mensaje enviado desde un cliente al servidor, que afecta al servidor, debe transmitir el cambio a todos los clientes conectados.
  • ¿Debe mi servidor ser un servicio de Windows? ¿Qué ventajas/desventajas presenta eso?

¿Alguna idea sobre cómo podría comenzar con esto? He estado investigando UDP Multicast y LAN Scans. Estoy usando C# y .NET 4.0

EDITAR: Encontré esto: http://code.google.com/p/lidgren-network-gen3/ ¿Alguien tiene alguna experiencia con él y puede recomendarlo o no recomendarlo?

preguntado el 12 de junio de 12 a las 15:06

2 Respuestas

Yo sugeriría NetPeerTcpBinding Comunicaciones WCF para crear Peer Mesh. Todos los clientes y servidores se unirían a una malla utilizando un sistema de resolución de pares. Puede usar PNRP o crear una resolución de pares personalizada (.Net en realidad le proporciona una implementación llamada CustomPeerResolverService). Ver Documentación de redes punto a punto.

También puede implementar un servicio de descubrimiento usando DiscoveryProxy. Con un servicio de descubrimiento, los servicios pueden anunciar sus puntos finales. El servicio de descubrimiento puede atender las solicitudes de búsqueda (ver Criterios de búsqueda) para devolver puntos finales que coincidan con las solicitudes. Esto se conoce como Descubrimiento administrado. Otro modo es Ad Hoc Discovery. Cada servicio anunciará sus puntos finales a través de UDP y los clientes de descubrimiento sondearán la red en busca de estos puntos finales.

De hecho, implementé un servicio de descubrimiento administrado en combinación con la red Peer 2 Peer WCF para proporcionar una malla redundante de servicios de descubrimiento que comparten puntos finales de servicio publicados a través de P2P. He descubierto que el uso de Managed Discovery funciona mucho mejor, ya que Ad Hoc Discovery mediante el sondeo UDP es más lento y tiene algunas limitaciones que cruzan algunos límites de red, mientras que Managed Discovery aprovecha un repositorio centralizado de puntos finales de servicio anunciados.

Creo que una o ambas tecnologías pueden conducir a su solución.

Respondido el 12 de junio de 12 a las 16:06

Hola Jim, estoy buscando probar el servicio Managed Discovery (llamado WS-Discovery si no me equivoco), pero veo que es para WCF como mencionaste. No tengo experiencia en WCF, y necesitaría lograr esto entre dos formas ganadoras. (Aplicación Client.exe y aplicación de bandeja Server.exe) ¿Sabe si esto es posible? ¿Tendrías algún enlace para ayudarme a implementar WCF en un formulario winform? He intentado un poco de googlear, pero el WCF me está desconcertando. :) ¡Gracias! EDITAR: leyendo más sobre WCF ahora, y puede ser exactamente lo que necesitamos. :S ¡Seguiré investigando! - DTI-Mate

@DTI-Matt, sí, WCF solo necesita un proceso de host. Puede crear un WCF muy fácilmente. Mire aquí para obtener información adicional: msdn.microsoft.com/en-us/library/ms730158 - Jim

Entonces, ¿es esto efectivamente una red de estilo peer to peer (casi como bittorrent), donde todos los servidores son clientes, pero no todos los clientes son servidores?

y los requisitos son que cada cliente debe tener una lista de todos los demás servidores (que son, a su vez, clientes).

El problema radica en llevar las direcciones IP del servidor a los clientes en primer lugar. Puede usar un servidor maestro que tenga un DNS fijo para que actúe como una especie de rastreador, en el que todos los servidores se registran y los clientes revisan periódicamente.

Otra opción (o un método adicional) es usar un sistema de estilo de intercambio entre pares, donde cada uno de los clientes y servidores usa paquetes de transmisión UDP a través de una red local para descubrirse entre sí y luego transferir los servidores que conocen, algo así como un enrutamiento. protocolo. Sin embargo, si las PC están repartidas en una red no local como Internet, hay pocas posibilidades de que se descubran por sí mismas, lo que hace que este método solo sea útil cuando se usa junto con otros métodos para encontrar servidores. Además, probablemente tendrá que lidiar con el enrutador UPnP para permitir que los clientes se conecten entre sí a través del NAT del enrutador, por lo que este método probablemente sea demasiado complejo para las ganancias que obtiene. (Sin embargo, si solo está en una LAN, ¡esto es todo lo que necesita!)

Una tercera opción (y de nuevo, esto se parece mucho a la tecnología de torrents), es usar tablas hash distribuidas para almacenar información sobre las direcciones IP de sus servidores en la nube, sin tener que depender de un servidor maestro central.

He tenido una oportunidad en un proyecto como este antes (un sistema de mensajería sin servidor P2P puro), pero nunca pude hacerlo funcionar. Sin una gran cantidad de pares o un servidor maestro para rastrear todos los demás servidores, es muy difícil recuperar de manera confiable las direcciones IP de todos los servidores.

Respondido el 12 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.