2009-03-23 2 views
3

Чтобы создать lan messenger в C#, мне нужно определить хост-компьютеры в Интернете, очевидно, используя одно и то же программное обеспечение для почтовых ящиков. Я попытался найти отправную точку, чтобы сделать это, но напрасно. Мне нужно знать, как начать работу.Обнаружение хостов, подключенных к LAN

ответ

1

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

0

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

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

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

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

2

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

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

+0

проклятый, бить меня к нему :) –

1

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

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

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

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

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

+0

могли бы вы предоставить мне любой образец кода, показывает, как будет работать топология без сервера? – Avik

0

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

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

1

Используйте этот GetComputers() я использовал в моей LAN 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; 
} 
Смежные вопросы