Пинговать узел в сети на основе его MAC-адреса - PullRequest
1 голос
/ 30 августа 2011

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

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

СЕЙЧАС, при этом единственная часть, с которой у меня возникают проблемы, - это фактическая часть, где я что-то пингую.Я знаю, что реальный «пинг» невозможен, когда дело доходит до MAC-адресов, так как я могу проверить что-то подобное?В качестве альтернативы, если это проще, я мог бы также принять эхо-запрос на основе имени компьютера.

РЕДАКТИРОВАТЬ: Я бы предпочел не использовать такие вещи, как arp, чтобы найти IP-адреса устройств, которые я хочу.Как я уже сказал, меня также интересует, можно ли искать устройства по имени.Будет ли это работать?

Ответы [ 4 ]

1 голос
/ 30 августа 2011

Если у вас правильно администрируемая среда, вы должны использовать имена.Под правильно управляемой средой я имею в виду, прежде всего, наличие DNS-сервера в вашей локальной сети.

У меня что-то похожее работает, что пингует промышленные устройства Ethernet.Это статически назначенные адреса, поэтому они не регистрируются в DNS, как DHCP-клиент.Я попросил нашего администратора DNS создать записи для них, чтобы я мог просто использовать их имя.В конечном итоге вам будет лучше, так как через два года вы не будете иметь ни малейшего представления о том, на что ссылался этот mac-адрес в вашем списке.При создании имен вы можете сделать их настолько описательными, насколько это необходимо.

РЕДАКТИРОВАТЬ: вот функция, которая принимает имя в виде строки, ищет связанный IP-адрес из DNS, а затем проверяет связь.Если разрешение DNS не удается или пинг не сообщает об успехе, функция возвращает false.В противном случае он возвращает истину.Вы также должны зарегистрировать исключения для устранения неполадок позже, кстати.

public bool Check(string Name)
{
    //try dns resolution, if fails, quit reporting error
    IPAddress[] addresses = null;
    try
    {
        addresses = Dns.GetHostAddresses(Name);
    }
    catch (SocketException)
    {
        return false;
    }

    //ping remote address
    PingReply reply = ping.Send(addresses[0]);
    switch (reply.Status)
    {
        case IPStatus.Success:
            return true;
            break;
        default:
            return false;
            break;
    }
}

РЕДАКТИРОВАТЬ 2: Вот пространства имен, которые я использую в этом проекте.Не уверен, что именно где, но добавив эти три, все получится.

using System.Net.NetworkInformation;
using System.Net;
using System.Net.Sockets;
1 голос
/ 30 августа 2011
0 голосов
/ 30 августа 2011

Если у вас есть MAC-адрес, вы можете получить IP-адрес и имя машины, используя MAC-адрес.Получив IP-адрес, вы можете просто пропинговать его.

См. этот код для примера того, как получить IP-адрес от MAC-адреса

0 голосов
/ 30 августа 2011

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

...