Обнаружение хостов, подключенных к локальной сети

Для создания сетевого мессенджера в C# мне нужно обнаружить хост-компьютеры в сети, очевидно, с использованием того же программного обеспечения Lan Messenger. Я пытался найти отправную точку для этого, но тщетно. Мне нужно знать, как начать работу.

7 ответов

В прошлом я делал это двумя способами: подключив всех клиентов к заранее определенному хосту (легко, но требует некоторой конфигурации клиента) и заставив хост (или клиента) транслировать свое существование через широковещательный адрес (например,, 10.0.255.255) (жестко, брандмауэры /NAT могут осложнить жизнь, клиенты не требуют настройки).

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

Используйте этот метод GetComputers(), который я использовал в своей локальной сети Messenger

using System.Diagnostics;

public static string[] GetComputers()
{
    //Process that retrieves the net view >> list of computers on the network
    Process proc = new Process();
    proc.StartInfo.FileName = "net.exe";
    proc.StartInfo.CreateNoWindow = true;
    proc.StartInfo.Arguments = "view";
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.UseShellExecute = false;
    proc.Start();

    //Reads the output of the net view.
    StreamReader sr = new StreamReader(proc.StandardOutput.BaseStream);
    string line = "";

    List<string> names = new List<string>();
    while ((line = sr.ReadLine()) != null)
    {
        if (line.StartsWith(@"\\"))
            names.Add(line.Substring(2).Split(' ')[0].TrimEnd());
    }

    sr.Close();
    proc.WaitForExit();

    //Array that contains computer names
    string[] computerNames = new string[names.Capacity];
    int i = 1;

    //Adds computers names to the list view
    foreach (string name in names)
    {
        computerNames[i] = name;
        i++;
    }

    return computerNames;
}

В зависимости от того, планируете ли вы полагаться на централизованный сервер или нет, у вас есть варианты:

1) Нет сервера: когда клиент выходит в сеть, он передает свою личность, прося других клиентов отправить их.

2) Централизованный сервер: подключается новый клиент, он регистрируется на сервере и загружает список клиентов. Затем каждый клиент уведомляется (либо посредством опроса, дуплексного контракта при использовании WCF, либо через базовое соединение с сокетом) о новом клиенте.

Первая версия будет основана на сокетах UDP. Обратите внимание, что это не работает вне локальной сети, так как я считаю, что эти пакеты не будут проходить через маршрутизаторы. Это также, вероятно, плохой дизайн, потому что большое количество клиентов просто заполонит сеть пакетами. Но эй, это может быть просто достаточно для вас.

Также WCF имеет одноранговую поддержку, это может быть интересно для вас. Вот статья об этом.

Можете ли вы использовать Windows Connection Foundation? Если это так, вы можете использовать WCF для реализации протокола WS-Discovery. Вот краткое руководство.

Вам может понравиться использование ZeroConf aka Bonjour, Rendevous или иногда Avahi.

http://www.mono-project.com/Mono.Zeroconf

http://craz.net/programs/ZeroconfNetServices/

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

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

Чтобы поддерживать актуальность списков, вы можете попросить всех клиентов транслировать свое существование в сети с полуслучайными интервалами (например, каждую минуту + ранд (10) секунд).

Все вышеперечисленное предполагает, что вы говорите о клиентах в одной сети. Если вы делаете это в Интернете, вам понадобится какой-то центральный пункт, который будет отслеживать ips зарегистрированных клиентов.

Я думаю, что можно пинговать ip трансляции и получить ответ от всех. Или что-то типа того. Можно начать с этого, а затем проверить, слушают ли клиенты какой-то порт или что-то еще.

Альтернатива - позволить клиентам сообщить серверу, что "мы все еще здесь!" очень часто

Другие вопросы по тегам