Обнаружение хостов, подключенных к локальной сети - PullRequest
3 голосов
/ 23 марта 2009

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

Ответы [ 7 ]

2 голосов
/ 23 марта 2009

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

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

1 голос
/ 04 сентября 2012

Используйте этот метод 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 голос
/ 23 марта 2009

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

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

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

1 голос
/ 23 марта 2009

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

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

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

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

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

1 голос
/ 23 марта 2009

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

0 голосов
/ 23 марта 2009

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

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

0 голосов
/ 23 марта 2009

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

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

Для поддержания актуальности списков все клиенты могут транслировать свое присутствие в сети с полуслучайными интервалами (например, каждую минуту + ранд (10) секунд).

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

...