Пинг или иначе сказать, если устройство находится в сети по MAC в C # - PullRequest
13 голосов
/ 02 апреля 2010

Я разрабатываю приложение для домашней безопасности. Одна вещь, которую я хотел бы сделать, это автоматически выключать и включать в зависимости от того, нахожусь ли я дома. У меня есть телефон с Wifi, который автоматически подключается к моей сети, когда я дома.

Телефон подключается и получает свой адрес через DHCP. Хотя я мог настроить его на использование статического IP-адреса, я бы предпочел не Есть ли в C # / .Net какой-либо Ping или аналог, который может взять MAC-адрес устройства и сказать мне, активно ли оно в сети в данный момент?

Редактировать: Для пояснения, я запускаю программное обеспечение на ПК, которое я хотел бы иметь возможность обнаруживать телефон в той же локальной сети.

Редактировать: Вот код, который я придумал, благодаря помощи Спулсона. Он надежно обнаруживает, находятся ли какие-либо телефоны, которые меня интересуют, в доме.

private bool PhonesInHouse()
{

    Ping p = new Ping();
    // My home network is 10.0.23.x, and the DHCP 
    // pool runs from 10.0.23.2 through 10.0.23.127.

    int baseaddr = 10;
    baseaddr <<= 8;
    baseaddr += 0;
    baseaddr <<= 8;
    baseaddr += 23;
    baseaddr <<= 8;

    // baseaddr is now the equivalent of 10.0.23.0 as an int.

    for(int i = 2; i<128; i++) {
        // ping every address in the DHCP pool, in a separate thread so 
        // that we can do them all at once
        IPAddress ip = new IPAddress(IPAddress.HostToNetworkOrder(baseaddr + i));
        Thread t = new Thread(() => 
             { try { Ping p = new Ping(); p.Send(ip, 1000); } catch { } });
        t.Start();
    }

    // Give all of the ping threads time to exit

    Thread.Sleep(1000);

    // We're going to parse the output of arp.exe to find out 
    // if any of the MACs we're interested in are online

    ProcessStartInfo psi = new ProcessStartInfo();
    psi.Arguments = "-a";
    psi.FileName = "arp.exe";
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;

    bool foundone = false;
    using (Process pro = Process.Start(psi))
    {
        using (StreamReader sr = pro.StandardOutput)
        {
            string s = sr.ReadLine();

            while (s != null)
            {
                if (s.Contains("Interface") || 
                    s.Trim() == "" || 
                    s.Contains("Address"))
                {
                    s = sr.ReadLine();
                    continue;
                }
                string[] parts = s.Split(new char[] { ' ' }, 
                    StringSplitOptions.RemoveEmptyEntries);

                // config.Phones is an array of strings, each with a MAC 
                // address in it.
                // It's up to you to format them in the same format as 
                // arp.exe
                foreach (string mac in config.Phones)
                {
                    if (mac.ToLower().Trim() == parts[1].Trim().ToLower())
                    {
                        try
                        {
                            Ping ping = new Ping();
                            PingReply pingrep = ping.Send(parts[0].Trim());
                            if (pingrep.Status == IPStatus.Success)
                            {
                                foundone = true;
                            }
                        }
                        catch { }
                        break;
                    }
                }
                s = sr.ReadLine();
            }
        }
    }

    return foundone;
}

Ответы [ 2 ]

2 голосов
/ 02 апреля 2010

Другой подход заключается в использовании инструментов ping и arp. Поскольку пакеты ARP могут оставаться только в одном и том же широковещательном домене, вы можете пропинговать широковещательный адрес своей сети, и каждый клиент ответит ответом ARP. Каждый из этих ответов кэшируется в вашей таблице ARP, которую вы можете просмотреть с помощью команды arp -a. Итак, краткое изложение:

rem Clear ARP cache
netsh interface ip delete arpcache

rem Ping broadcast addr for network 192.168.1.0
ping -n 1 192.168.1.255

rem View ARP cache to see if the MAC addr is listed
arp -a

Некоторые из них могут быть выполнены в управляемом коде, например, в пространстве имен System.Net.NetworkInformation.

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

1 голос
/ 02 апреля 2010

Вы можете использовать протокол RARP для передачи запроса о том, кто владеет этим MAC-адресом. Владелец ответит своим IP-адресом. Я не знаю, какой инструмент или библиотеку RARP можно было бы рекомендовать, поэтому вы можете написать собственный сетевой уровень для отправки / получения этих пакетов.

...