Qual é a melhor maneira para um aplicativo cliente para encontrar um servidor em uma rede local em C #?

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

Pergunta

o cliente se conecta ao servidor usando o GenuineChannels (estamos pensando em mudar para DotNetRemoting). O que quero dizer com descoberta é obter o número IP ea porta de um servidor para se conectar.

Parece que uma abordagem de força bruta seria tentar cada IP na rede tentar as portas ativas (nem tenho certeza se isso é possível), mas deve haver uma maneira melhor.

Foi útil?

Solução

Considere transmissão de um pacote específico UDP. Quando o servidor ou servidores vê o pacote UDP transmitido eles enviar uma resposta. O cliente pode coletar as respostas de todos os servidores e começar a ligar para eles ou com base em um algoritmo de eleição.

Veja o exemplo para o cliente ( código não testado ):


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

Outras dicas

Eu diria que a melhor maneira é usar Bonjour / Zeroconf / mDNS para C #; um monte de pensamento foi para torná-lo jogar bonito com a rede; Ou seja, pings menos frequência ao longo do tempo, se possível, etc. Há Mono.Zeroconf , e eu li há um projeto .NET mais velho na a Apple SDK mas eu não tê-lo encontrado.

Então, o mais fácil seria instalar Bonjour para Windows , então, fazer o < a href = "http://download.banshee-project.org/mono-zeroconf/mono-zeroconf-0.8.0-binary.zip" rel = "noreferrer"> Windows binários para Mono.Zeroconf tentar o exemplo MZClient.exe largar o Mono.Zeroconf.dll e / ou Mono.Zeroconf.Providers.Bonjour.dll em suas referências do projeto e vão.

Algo parecido com isto:

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

Apenas queria salientar um pacote Zeroconf NuGet alternativa: Zeroconf . Ele não tem quaisquer dependências nativas, assim você não precisa instalar o Bonjour para Windows ou qualquer outra coisa.

Tem suporte para .NET 4.5, WP8 e Win8.

WS-Discovery é um protocolo destinado a essa finalidade. Tem algumas variações diferentes, sabores diferentes de radiodifusão e proxies. http://en.wikipedia.org/wiki/WS-Discovery

.NET WCF4 implementos isso.

Tenha o servidor escuta para transmissão em uma porta específica na rede (deve usar UDP), quando começa cliente tem que transmitir alguns "ping" pedido nessa porta. quando o servidor vê um "ping" é enviar de volta uma mensagem com o endereço TCP e porta necessária para o cliente se conectar a ele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top