Domanda

Il client si connette al server utilizzando GenuineChannels (stiamo valutando di passare a DotNetRemoting). Quello che intendo per trovare è ottenere l'IP e il numero di porta di un server a cui connettersi.

Sembra che un approccio a forza bruta sarebbe provare ogni IP sulla rete provare le porte attive (non sono nemmeno sicuro che sia possibile) ma ci deve essere un modo migliore.

È stato utile?

Soluzione

Prendi in considerazione la trasmissione di un pacchetto UDP specifico. Quando il server oi server visualizzano il pacchetto UDP trasmesso, inviano una risposta. Il client può raccogliere le risposte da tutti i server e iniziare a connettersi a loro o sulla base di un algoritmo elettorale.

Vedi esempio per client ( codice non testato ):


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

Altri suggerimenti

Direi che il modo migliore è usare Bonjour / Zeroconf / mDNS per C #; si pensò molto a renderlo piacevole con la rete; Vale a dire che esegue il ping meno frequentemente nel tempo, se possibile, ecc. C'è Mono.Zeroconf e ho letto che c'è un vecchio progetto .NET nel SDK di Apple ma non l'ho trovato.

Quindi il modo più semplice sarebbe installare Bonjour per Windows , quindi ottenere < a href = "http://download.banshee-project.org/mono-zeroconf/mono-zeroconf-0.8.0-binary.zip" rel = "noreferrer"> File binari di Windows per Mono.Zeroconf provare esempio MZClient.exe rilascia il Mono.Zeroconf.dll e / o Mono.Zeroconf.Providers.Bonjour.dll nei riferimenti del progetto e vai .

Qualcosa del genere:

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

Volevo solo segnalare un pacchetto NuGet Zeroconf alternativo: Zeroconf . Non ha dipendenze native, quindi non è necessario installare Bonjour per Windows o altro.

Ha il supporto per .NET 4.5, WP8 e Win8.

WS-Discovery è un protocollo destinato a questo scopo. Ha alcune varianti diverse, diversi gusti di trasmissione e proxy. http://en.wikipedia.org/wiki/WS-Discovery

.NET WCF4 lo implementa.

Chiedi al server di essere ascoltato per la trasmissione su una porta specifica della rete (deve usare UDP), All'avvio del client fai trasmettere un po 'di "ping" richiesta su quella porta. quando il server vede un " ping " restituisce un messaggio con l'indirizzo TCP e la porta richiesti per la connessione del client ad esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top