Как лучше всего найти клиентское приложение в локальной сети в C #? - PullRequest
12 голосов
/ 17 октября 2008

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

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

Ответы [ 5 ]

11 голосов
/ 17 октября 2008

Рассмотрим широковещательную рассылку определенного пакета 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
    }
}
8 голосов
/ 17 октября 2008

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

Таким образом, проще всего было бы установить Bonjour для 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");
3 голосов
/ 19 сентября 2013

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

Имеется поддержка .NET 4.5, WP8 и Win8.

2 голосов
/ 03 марта 2011

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

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

1 голос
/ 17 октября 2008

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

...