需要帮助使用Windows IP Helper API& C#中的ParseNetworString

时间:2009-07-07 22:57:20

标签: c# winapi networking

我正在尝试重写一些C#Web服务代码,该代码使用Windows IP Helper API调用“SendARP”来检索远程系统的MAC地址。 SendARP运行良好 - 直到您跨越网段,因为Arp请求未被路由。在StackOverflow上存在它之后,我一直在查看“ParseNetworkString”文档。快速&我想到的脏算法是:

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”是Vista / Win2008的新功能所以我无法找到示例C#代码演示它的用法而且我不是C ++编码器所以如果有人能指出我正确的方向...

1 个答案:

答案 0 :(得分:0)

试试这个:(未经测试)

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

您应该将types参数设为枚举;我太懒了。 您还需要移植SOCKADDR_INSOCKADDR_IN6SOCKADDR结构。