Как клиентскому приложению лучше всего найти сервер в локальной сети на C#?

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

Вопрос

Клиент подключается к серверу с помощью GenuineChannels (мы рассматриваем возможность перехода на DotNetRemoting).Под поиском я подразумеваю получение IP-адреса и номера порта сервера, к которому нужно подключиться.

Кажется, что подход грубой силы будет заключаться в том, чтобы попробовать каждый IP-адрес в сети и активные порты (даже не уверен, возможно ли это), но должен быть лучший способ.

Это было полезно?

Решение

Рассмотрите возможность широковещательной передачи определенного пакета UDP.Когда сервер или серверы видят широковещательный пакет UDP, они отправляют ответ.Клиент может собрать ответы со всех серверов и начать подключаться к ним или на основе алгоритма выборов.

См. пример для клиента (непроверенный код):


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

Другие советы

Я бы сказал, что лучший способ — использовать Bonjour/Zeroconf/mDNS для C#;много усилий было потрачено на то, чтобы сделать так, чтобы оно хорошо взаимодействовало с сетью;IE, если возможно, со временем он пингует реже и т. д.Есть Моно.Zeroconf, и я прочитал, что в Apple SDK но я не нашел его.

Поэтому проще всего будет установить Бонжур для Windows, затем получите Бинарные файлы Windows для Mono.Zeroconf попробуйте пример MZClient.exe брось Mono.Zeroconf.dll и/или Mono.Zeroconf.Providers.Bonjour.dll в ссылки на ваш проект и вперед.

Что-то вроде этого:

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

Просто хотел указать на альтернативный пакет Zeroconf NuGet: Зероконф.У него нет никаких собственных зависимостей, поэтому вам не нужно устанавливать Bonjour для Windows или что-то еще.

Он поддерживает .NET 4.5, WP8 и Win8.

WS-Discovery — это протокол, предназначенный для этой цели.У него есть несколько разных вариаций, разные варианты вещания и прокси. http://en.wikipedia.org/wiki/WS-Discovery

.NET WCF4 реализует это.

Пусть сервер прослушивает трансляцию на определенном порту в сети (должен использовать UDP). Когда клиент запускается, он должен транслировать некоторый запрос «ping» на этот порт.когда сервер видит «пинг», он отправляет обратно сообщение с TCP-адресом и портом, необходимыми для подключения клиента к нему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top