Was ist der beste Weg für eine Client-Anwendung einen Server in einem lokalen Netzwerk in C # zu finden?

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

Frage

Der Client verbindet sich mit dem Server unter Verwendung GenuineChannels (wir betrachten zu DotNetRemoting schaltend). Was ich meine ist, finden die IP und die Portnummer eines Servers zu erhalten, um zu verbinden.

Es scheint wie ein Brute-Force-Ansatz wäre, versuche jede IP im Netzwerk der aktiven Ports versucht (nicht einmal sicher, ob das möglich ist), aber es muss ein besserer Weg geben.

War es hilfreich?

Lösung

Betrachten sie ein bestimmtes UDP-Paket sendet. Wenn der Server oder die Server die gesendete UDP-Paket zu sehen senden sie eine Antwort. Der Kunde kann sich die Antworten von allen Servern sammeln und starten Sie diese anschließen oder auf der Grundlage eines Auswahlalgorithmus.

Siehe Beispiel für Client ( ungetesteten Code ):


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

Andere Tipps

Ich würde sagen, der beste Weg, Bonjour / Zeroconf / mDNS für C # zu verwenden ist; eine Menge Gedanken gingen in die es mit dem Netzwerk spielen schön; IE es Pings weniger häufig im Laufe der Zeit, wenn möglich, etc. Es gibt Mono.Zeroconf , und ich lese es ein älteres .NET-Projekt in der Apple-SDK aber ich habe es nicht gefunden.

Der einfachste wäre Bonjour für Windows zu installieren, dann ist die get < a href = "http://download.banshee-project.org/mono-zeroconf/mono-zeroconf-0.8.0-binary.zip" rel = "noreferrer"> Windows-Binaries für Mono.Zeroconf versuchen die Beispiel MZClient.exe die Mono.Zeroconf.dll und / oder Mono.Zeroconf.Providers.Bonjour.dll in Ihre Projektreferenzen fallen und gehen.

So etwas wie folgt aus:

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

Ich wollte nur ein alternatives Zeroconf NuGet Paket hinweisen: Zeroconf . Es werden keine nativen Abhängigkeiten haben, so brauchen Sie nicht Bonjour für Windows oder irgendetwas anderes zu installieren.

Es hat Unterstützung für .NET 4.5, WP8 und Win8.

WS-Discovery ist ein Protokoll für diesen Zweck bestimmt ist. Es hat ein paar verschiedene Varianten, verschiedene Varianten von Rundfunk und Proxies. http://en.wikipedia.org/wiki/WS-Discovery

.NET WCF4 implementiert diese.

Haben Sie den Server für die Übertragung auf einem bestimmten Port im Netzwerk hört (muss UDP), Wenn der Client gestartet hat es ausgestrahlt einig „ping“ Anfrage an diesem Port. wenn der Server einen „ping“ es sieht, die für den Client, um es schließen Sie eine Nachricht mit der TCP-Adresse und Port zurückschicken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top