2009-07-07 1 views
-1

Je tente de réécrire du code de service Web C# qui utilise l'appel de l'API d'assistance IP Windows "SendARP" pour récupérer l'adresse MAC d'un système distant. SendARP fonctionne parfaitement - jusqu'à ce que vous traversiez un segment de réseau car les requêtes Arp ne sont pas routées. J'ai regardé la documentation "ParseNetworkString" après avoir traversé son existence sur StackOverflow. L'algorithme sale & rapide, j'ai à l'esprit est:Besoin d'aide pour utiliser l'API Windows IP Helper & ParseNetworString en C#

public static string GetMacAddress(string strHostOrIP) 
{ 
    if (strHostOrIP is IPAddress) 
    { 
     parse results of nbstat -A strHostOrIP 
     return macAddress 
    } 
    if (strHostOrIP is Hostname) 
    { 
     IPHostEntry hostEntry = null; 
     try 
     { 
      hostEntry = Dns.GetHostEntry(strHostOrIP); 
     } 
     catch 
     { 
      return null; 
     } 
     if (hostEntry.AddressList.Length == 0) 
     { 
      return null; 
     } 
     foreach (IPAddress ip in hostEntry.AddressList) 
     { 
      if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
      { 
       ipAddress = ip; 
       break; 
      } 
     } 
    } 
    return GetMACAddress(ipAddress); 

}

« ParseNetworkString » est nouveau avec Vista/Win2008 donc je ne l'ai pas été en mesure de trouver par exemple du code C# démontrant son utilisation et je m pas C++ codeur donc si quelqu'un peut me diriger dans la bonne direction ...

Répondre

0

Essayez ceci: (non testé)

[DllImport("IpHlpApi.dll", Charset = Charset.Unicode)] 
static int ParseNetWorkString(ref string networkString, int types, out NetAddressInfo addressInfo, out ushort portNumber, out byte prefixLength); 

[StructLayout(LayoutKind.Sequential)] 
struct NamedAddress { 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] //DNS_MAX_NAME_BUFFER_LENGTH 
    public string Address; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)] 
    public string Port; 
} 
[StructLayout(LayoutKind.Explicit)] 
struct NetAddressInfo { 
    public int Format; //I'm too lazy to port the enum; you should 

    [FieldOffset(4)] 
    public NamedAddress NamedAddress; 
    [FieldOffset(4)] 
    public SOCKADDR_IN Ipv4Address; 
    [FieldOffset(4)] 
    public SOCKADDR_IN6 Ipv6Address; 
    [FieldOffset(4)] 
    public SOCKADDR IpAddress; 
} 

Vous devez faire des types paramètre une énumération; Je suis trop paresseux. Vous devrez également porter les structures SOCKADDR_IN, SOCKADDR_IN6 et SOCKADDR.

Questions connexes