Quel est le meilleur moyen pour une application cliente de trouver un serveur sur un réseau local en C #?

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

Question

Le client se connecte au serveur via GenuineChannels (nous envisageons de passer à DotNetRemoting). Ce que je veux dire par trouver, c'est obtenir l'adresse IP et le numéro de port d'un serveur auquel se connecter.

Il semble qu'une approche brutale serait d'essayer toutes les adresses IP du réseau d'essayer les ports actifs (sans même savoir si cela est possible), mais il doit y avoir un meilleur moyen.

Était-ce utile?

La solution

Envisagez de diffuser un paquet UDP spécifique. Lorsque le ou les serveurs voient le paquet UDP diffusé, ils envoient une réponse. Le client peut collecter les réponses de tous les serveurs et commencer à s'y connecter ou sur la base d'un algorithme d'élection.

Voir un exemple pour le client ( code non testé) :

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
    }
}

Autres conseils

Je dirais que le meilleur moyen est d'utiliser Bonjour / Zeroconf / mDNS pour C #; beaucoup de réflexion a été faite pour que cela fonctionne bien avec le réseau; Par exemple, il y a Mono.Zeroconf , et j'ai lu un ancien projet .NET dans le SDK Apple , mais je ne l'ai pas trouvé. / p>

Donc, le plus simple serait d'installer Bonjour pour Windows , puis obtenez le < a href = "http://download.banshee-project.org/mono-zeroconf/mono-zeroconf-0.8.0-binary.zip" rel = "noreferrer"> Fichiers binaires Windows pour Mono.Zeroconf exemple MZClient.exe déposez le Mono.Zeroconf.dll et / ou le Mono.Zeroconf.Providers.Bonjour.dll dans vos références de projet et passez à .

Quelque chose comme ça:

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

Je voulais simplement signaler un autre package Zeroconf NuGet: Zeroconf . Il n’a aucune dépendance native, vous n’avez donc pas besoin d’installer Bonjour pour Windows ou autre chose.

Il prend en charge .NET 4.5, WP8 et Win8.

WS-Discovery est un protocole conçu à cet effet. Il a quelques variantes différentes, différentes saveurs de diffusion et des mandataires. http://fr.wikipedia.org/wiki/WS-Discovery

.NET WCF4 l'implémente.

Demandez au serveur d'écouter la diffusion sur un port spécifique du réseau (vous devez utiliser UDP). Lorsque le client démarre, faites-le diffuser un "ping". demande sur ce port. lorsque le serveur voit un " ping " il renvoie un message avec l'adresse TCP et le port requis pour que le client puisse s'y connecter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top