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

StackOverflow https://stackoverflow.com/questions/210446

Pregunta

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

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

¿Fue útil?

Solución

Considere 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 ellos o según un algoritmo de elección.

Ver ejemplo para 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
    }
}

Otros consejos

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

Entonces, lo más fácil sería instalar Bonjour para Windows , luego obtenga el < a href = "http://download.banshee-project.org/mono-zeroconf/mono-zeroconf-0.8.0-binary.zip" rel = "noreferrer"> Windows Binarios para Mono.Zeroconf pruebe el ejemplo MZClient.exe suelte el Mono.Zeroconf.dll y / o Mono.Zeroconf.Providers.Bonjour.dll en sus referencias de proyecto y vaya .

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");

Solo quería señalar un paquete alternativo de Zeroconf NuGet: Zeroconf . No tiene dependencias nativas, por lo que no necesita instalar Bonjour para Windows ni nada más.

Tiene soporte para .NET 4.5, WP8 y Win8.

WS-Discovery es un protocolo destinado a este propósito. Tiene algunas variaciones diferentes, diferentes sabores de transmisión y proxies. http://en.wikipedia.org/wiki/WS-Discovery

.NET WCF4 implementa esto.

Haga que el servidor escuche la transmisión en un puerto específico de la red (debe usar UDP). Cuando el cliente se inicie, haga que se transmita algo de "ping". solicitud en ese puerto. cuando el servidor ve un "ping" envía un mensaje con la dirección TCP y el puerto necesarios para que el cliente se conecte a él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top