2010-01-25 11 views
1

Existe-t-il un moyen de résoudre l'adresse mac de la passerelle par défaut en utilisant C#?Obtenir l'adresse MAC de la passerelle par défaut?

mise à jour im travailler avec

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

mais je me sens comme si je manque quelque chose.

Répondre

1

Vous aurez probablement besoin d'utiliser P/Invoke et certaines fonctions API Win natives.

Jetez un oeil à ce tutorial.

3

Quelque chose comme cela devrait fonctionner pour vous, même si vous voulez probablement ajouter plus de vérification des erreurs:

[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; 
} 
3

Qu'est-ce que vous voulez vraiment est d'effectuer une demande Resolution Protocol Adresse (ARP). Il y a de bonnes et pas très bonnes façons de le faire.

  • Utilisez une méthode existante dans le cadre .NET (bien que je doute qu'il existe)
  • Écrivez votre propre méthode de requête ARP (probablement plus de travail que vous cherchez)
  • Utilisez une bibliothèque gérée (si elle existe)
  • utilisez une bibliothèque non géré (comme iphlpapi.dll comme suggéré par Kevin)
  • Si vous savez que vous avez seulement besoin à distance pour obtenir l'adresse MAC d'un ordinateur Windows à distance au sein de votre réseau, vous pouvez utiliser Windows Management Instrumentation (WMI)

exemple 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); 
        } 
       } 
      } 
     } 
    } 
} 
+1

+1 pour une explication agréable et une bonne technique (aussi longtemps que la passerelle fonctionne sous Windows). – Kevin