получить mac-адрес от шлюза по умолчанию?

Есть ли способ разрешить MAC-адрес шлюза по умолчанию с помощью С#?

обновить я работаю с

var x = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses; 

но я чувствую, что что-то упускаю.


person Crash893    schedule 25.01.2010    source источник


Ответы (3)


Что-то вроде этого должно работать для вас, хотя вы, вероятно, захотите добавить дополнительную проверку ошибок:

[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(uint destIP, uint srcIP, byte[] macAddress, ref uint macAddressLength);

public static byte[] GetMacAddress(IPAddress address)
{
  byte[] mac = new byte[6];
  uint len = (uint)mac.Length;      
  byte[] addressBytes = address.GetAddressBytes();      
  uint dest = ((uint)addressBytes[3] << 24) 
    + ((uint)addressBytes[2] << 16) 
    + ((uint)addressBytes[1] << 8) 
    + ((uint)addressBytes[0]);      
  if (SendARP(dest, 0, mac, ref len) != 0)
  {
    throw new Exception("The ARP request failed.");        
  }
  return mac;
}
person Kevin    schedule 25.01.2010

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

  • Используйте существующий метод в .NET framework (хотя я сомневаюсь, что он существует)
  • Напишите свой собственный метод запроса ARP (возможно, больше работы, чем вы ищете)
  • Используйте управляемую библиотеку (если она существует)
  • Используйте неуправляемую библиотеку (например, iphlpapi.dll, предложенную Кевином).
  • Если вы знаете, что вам нужен удаленный доступ только для получения MAC-адреса удаленного компьютера с Windows в вашей сети, вы можете использовать инструментарий управления Windows (WMI).

Пример WMI:

using System;
using System.Management;

namespace WMIGetMacAdr
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementScope scope = new ManagementScope(@"\\localhost");  // TODO: remote computer (Windows WMI enabled computers only!)
            //scope.Options = new ConnectionOptions() { Username = ...  // use this to log on to another windows computer using a different l/p
            scope.Connect();

            ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_NetworkAdapterConfiguration"); 
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

            foreach (ManagementObject obj in searcher.Get())
            {
                string macadr = obj["MACAddress"] as string;
                string[] ips = obj["IPAddress"] as string[];
                if (ips != null)
                {
                    foreach (var ip in ips)
                    {
                        Console.WriteLine("IP address {0} has MAC address {1}", ip, macadr );
                    }
                }
            }
        }
    }
}
person Christian V    schedule 25.01.2010
comment
+1 за хорошее объяснение и хорошую технику (пока шлюз работает под управлением Windows). - person Kevin; 26.01.2010

Вам, вероятно, потребуется использовать P/Invoke и некоторые собственные функции Win API.

Ознакомьтесь с этим руководством.

person Tony The Lion    schedule 25.01.2010