2012-01-19 2 views
1

Я пытаюсь преобразовать IP-адрес в MAC-адрес, а затем преобразовать его в массив байтов. Я застрял в первой части и не знаю, как это сделать. Я видел, что некоторые результаты поиска говорят о System.Net.NetworkInformation.NetworkInterface, но не уверены, как их использовать.Как преобразовать IP-адрес в массив байтов MAC-адресов?

Это мой код, который нуждается в массиве байтов MAC. Как это сделать?

[DllImport("iphlpapi.dll", ExactSpelling = true)] 
public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen); 

private void Ping(IPAddress address) 
{ 
    byte[] macAddr = new byte[6]; 
    uint macAddrLen = uint.Parse(macAddr.Length.ToString()); 

    if (SendARP(int.Parse(address.ToString()), 0, macAddr, ref macAddrLen) == 0) 
    { 
     //SUCCESS! 
    } 
} 
+1

Что вы пытаетесь сделать? MAC-адрес недоступен, кроме хост-машины, поэтому я не понимаю ваш вопрос – CharlesB

+0

@CharlesB, я пытаюсь сделать [this] (http://stackoverflow.com/a/8924588/720323) работу. Проблема в том, что моя последняя переменная macAddrLen не назначена. – HelpNeeder

+2

MAC-адрес адаптера доступен только в том же сегменте сети. Не на другой стороне маршрутизатора. – spender

ответ

6

Получить о о том, что вы пытаетесь сделать. Это позволяет перевести свой номер телефона на название улицы - между ними нет никакой корреляции.

MAC-адрес закодирован в драйвере уровня Ethernet, в то время как IP-адрес является искусственной конструкцией выше по IP-протоколу. Взаимоотношения между ними. Маршрутизаторы находят MAC-адреса для отправки IP-пакетов через aprotocol (ARP-Address Resolution Protocol), и это не может пересекать сегменты сети.

+0

Очень четкое объяснение. Хорошо, поэтому я смотрел на это неправильно. +1. – HelpNeeder

4

Посмотрите here:

byte[] macAddr = new byte[6]; 
uint macAddrLen = (uint) macAddr.Length; 
if (SendARP((int)address.Address, 0, macAddr, ref macAddrLen) != 0) 
    throw new InvalidOperationException("SendARP failed."); 

string[] str = new string[(int)macAddrLen]; 
for (int i = 0; i < macAddrLen; i++) 
    str[i] = macAddr[i].ToString("x2"); 

Console.WriteLine(string.Join(":", str)); 
+0

Я пытаюсь использовать этот код, но тот же, что и мой, вызывает ошибку в строке оператора if. Строка ввода не была в правильном формате. Вы знаете, почему? – HelpNeeder

+0

@HelpNeeder, пожалуйста, см. Мое редактирование. Ошибка в вызове int.Parse (преобразование адреса в строку возвращает IP-адрес в форме «xxxx», который не может быть преобразован в int) – Strillo

+0

Код не работает, потому что вы пытаетесь преобразовать IP-адрес для строки и затем проанализировать это в int -> int.Parse (address.ToString()). Для работы кода вам нужен объект IPaddress, а затем используйте его следующим образом: (int) YourIPObject.Address – SanBen

3

На самом деле MAC-адрес дается вам. Вам не нужно знать, что такое MAC-адрес компьютера. macAddr будет удерживать MAC-адрес после вызова функции SendARP.

В файле MSDN documentation вы можете видеть, что параметры macAddr и macAddrLen отмечены как [out], что означает, что функция использует эти аргументы, чтобы вернуть вам значение.

Вся точка Address Resolution Protocol, что вы можете разрешить сетевой уровень адреса (IP) к физическим адресам (MAC)