2009-07-07 13 views
-1

Windows IP Helper API呼び出し「SendARP」を使用してリモートシステムのMACアドレスを取得するC#Webサービスコードを書き直そうとしています。 SendARPはうまく動作します - あなたがArpリクエストがルーティングされないのでネットワークセグメントを越えるまで。私は "ParseNetworkString"のドキュメントStackOverflowの存在を横断して起こった後で見てきました。私が考えているの迅速&汚いアルゴリズムは次のとおりです。C#でWindows IP Helper APIとParseNetworStringを使用する際の助けが必要

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」ので、私はその使用方法を示す例C#のコードを見つけることができていないと私は」ビスタ/ Win2008で新しく追加されました誰もが正しい方向に私を指すことができれば...

答えて

0

はこれを試してみてくださいようがないC++コーダーをmは:(未テスト)

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

あなたはをしなければなりませんパラメータenum;私は怠け者だ。 また、SOCKADDR_IN,SOCKADDR_IN6、およびSOCKADDR構造体も移植する必要があります。

関連する問題