2014-01-13 4 views
1

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

Некоторые из вещей, которые я пробовал: (Это только соответствующие части.)

Это:

Dns.GetHostName(); ... //(Just gives me this computer's name.) 

И это:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain) ... // "The server could not be contacted." 

А также это:

DirectorySearcher searcher = new DirectorySearcher("(objectCategory=computer)", new[] { "Name" }); 
SearchResultCollection SRC = searcher.FindAll(); ... // "The specified domain either does not exist or could not be contacted." 

И:

DirectoryEntry root = new DirectoryEntry("WinNT:"); 
foreach (DirectoryEntry dom in root.Children) 
    foreach (DirectoryEntry entry in dom.Children) 
     if (entry.Name != "Schema") 
      result += entry.Name + "\r\n"; // https://stackoverflow.com/a/5581339/939213 returns nothing. 

Итак, как сделать я получаю имена компьютеров?

Меня не интересует какая-либо сторонняя библиотека. Мне известно о http://www.codeproject.com/Articles/16113/Retreiving-a-list-of-network-computer-names-using, но этот код с 2006 года. Я надеюсь, что есть определенный способ сделать это к настоящему времени. И согласно Getting computer names from my network places - «Не используйте DirectoryServices, если вы не уверены в среде домена».

+0

http://stackoverflow.com/a/2383454/264607 – BlackICE

+0

Пожалуйста, объясните вашу фактическую проблему. Найти все компьютеры в сети относительно сложно, и обычно это не то, что вы хотите сделать. Вы знаете о [Обнаружении WCF] (http://msdn.microsoft.com/en-us/library/dd456782 (v = vs.110) .aspx)? – CodeCaster

+0

@CodeCaster Открыт ли WCF Discovery другим компьютерам о службе WCF? Если так - это именно то, что я ищу. Я хочу, чтобы один компьютер мог узнать, какие другие компьютеры существуют там, где будут использоваться сервисы. – ispiro

ответ

3

Вы можете получить список IP-адресов всех компьютеров, присутствующих в локальной сети (в ответ от команды ARP), используя этот фрагмент кода:

static List<string> GetARP() 
{ 
    List<string> _ret = new List<string>(); 

    Process netUtility = new Process(); 
    netUtility.StartInfo.FileName = "arp.exe"; 
    netUtility.StartInfo.CreateNoWindow = true; 
    netUtility.StartInfo.Arguments = "-a"; 
    netUtility.StartInfo.RedirectStandardOutput = true; 
    netUtility.StartInfo.UseShellExecute = false; 
    netUtility.StartInfo.RedirectStandardError = true; 
    netUtility.Start(); 

    StreamReader streamReader = new StreamReader(netUtility.StandardOutput.BaseStream, netUtility.StandardOutput.CurrentEncoding); 

    string line = ""; 
    while ((line = streamReader.ReadLine()) != null) 
    { 

     if (line.StartsWith(" ")) 
     { 
      var Itms = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 

      if (Itms.Length == 3) 
       _ret.Add(Itms[0]); 
     } 
    } 

    streamReader.Close(); 

    return _ret; 

} 

Вы можете попытаться индивидуально разрешить имя каждой машины по телефону Dns.GetHostByAddress(targetIP).

+0

Предполагается, что IP-адрес устройства, к которому вы хотите подключиться, находится в кеше ARP, которого он не должен. – CodeCaster

+0

@CodeCaster Вы правы в кэше ARP, но, согласно OP, «несколько компьютеров подключены к одному беспроводному маршрутизатору». Я бы подумал, что посторонний случай - или я ошибаюсь? – OnoSendai

+0

Спасибо. Я заменил 'Itms [0]' на 'Dns.GetHostByAddress (Itms [0]). HostName' и получил следующую ошибку:' Запрашиваемое имя действительно, но не найдены данные запрашиваемого типа'. – ispiro

Смежные вопросы