c# remoting client-server service-discovery
Binarios de Windows para Mono.Zeroconf

¿Cuál es la mejor forma de que una aplicación cliente encuentre un servidor en una red local en C#?



remoting client-server (5)

Considere la posibilidad de transmitir un paquete UDP específico. Cuando el servidor o los servidores ven el paquete UDP emitido, envían una respuesta. El cliente puede recopilar las respuestas de todos los servidores y comenzar a conectarse a ellas o basándose en un algoritmo de elección.

Ver ejemplo para el cliente ( código no probado ):

using System.Net; using System.Net.Sockets; [STAThread] static void Main(string[] args) { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.Bind(new IPEndPoint(IPAddress.Any, 8002)); socket.Connect(new IPEndPoint(IPAddress.Broadcast, 8001)); socket.Send(System.Text.ASCIIEncoding.ASCII.GetBytes("hello")); int availableBytes = socket.Available; if (availableBytes > 0) { byte[] buffer = new byte[availableBytes]; socket.Receive(buffer, 0, availableBytes, SocketFlags.None); // buffer has the information on how to connect to the server } }

El cliente se conecta al servidor usando GenuineChannels (estamos considerando cambiar a DotNetRemoting). Lo que quiero decir con find es obtener el IP y el número de puerto de un servidor para conectarse.

Parece que un enfoque de fuerza bruta sería intentar cada IP en la red probar los puertos activos (ni siquiera estoy seguro si eso es posible) pero debe haber una mejor manera.


Pida al servidor que escuche la transmisión en un puerto específico de la red (debe usar UDP). Cuando el cliente comienza ha emitir una solicitud de "ping" en ese puerto. cuando el servidor ve un "ping" envía de vuelta un mensaje con la dirección TCP y el puerto requerido para que el cliente se conecte.


Yo diría que la mejor manera es usar Bonjour / Zeroconf / mDNS para C #; se pensó mucho en hacerlo jugar bien con la red; Es decir, suena con menos frecuencia con el tiempo si es posible, etc. Hay Mono.Zeroconf , y he leído que hay un proyecto .NET más antiguo en el SDK de Apple, pero no lo he encontrado.

Así que lo más fácil sería instalar Bonjour para Windows , luego obtener los Binarios de Windows para Mono.Zeroconf probar el ejemplo MZClient.exe soltar el Mono.Zeroconf.dll y / o Mono.Zeroconf.Providers.Bonjour.dll en las referencias de su proyecto y ir.

Algo como esto:

var service = new Mono.Zeroconf.RegisterService { Name = "Use Me for Stuff", RegType = "_daap._tcp", ReplyDomain = "local.", Port = 0024200, TxtRecord = new Mono.Zeroconf.TxtRecord { {"I have no idea what''s going on", "true"}} }; service.Register(); var browser = new Mono.Zeroconf.ServiceBrowser(); browser.ServiceAdded += delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) { Console.WriteLine("Found Service: {0}", args.Service.Name); args.Service.Resolved += delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) { var s = args.Service; Console.WriteLine( "Resolved Service: {0} - {1}:{2} ({3} TXT record entries)", s.FullName, s.HostEntry.AddressList[0], s.Port, s.TxtRecord.Count); }; args.Service.Resolve(); }; browser.Browse("_daap._tcp", "local");


WS-Discovery es un protocolo diseñado para este fin. Tiene algunas variaciones diferentes, diferentes sabores de difusión y proxies. http://en.wikipedia.org/wiki/WS-Discovery

.NET WCF4 implementa esto.


Solo quería señalar un paquete Zeroconf NuGet alternativo: Zeroconf . No tiene dependencias nativas, por lo que no necesita instalar Bonjour para Windows o cualquier otra cosa.

Tiene soporte para .NET 4.5, WP8 y Win8.