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

C# 需要使用Windows IP Helper API的帮助&;C语言中的ParseNetworString#,c#,winapi,networking,C#,Winapi,Networking,我正试图重写一些C#web服务代码,该代码使用Windows IP Helper API调用“SendARP”来检索远程系统的MAC地址。SendARP工作得很好-直到你穿越一个网段,因为Arp请求没有被路由。在StackOverflow上出现“ParseNetworkString”文档之后,我一直在查看它。我想到的快速脏算法是: public static string GetMacAddress(string strHostOrIP) { if (strHostOrIP is IP

我正试图重写一些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);
}

“PrSeNeWorkStudio”是Vista /Wi2008的新版本,所以我无法找到示例C代码来演示它的用法,我不是C++程序员,所以如果有人能指出我的正确方向…

< P>试试这个(未测试)

您应该将
types
参数设置为枚举;我太懒了。 您还需要在中移植
SOCKADDR\u、在6
中移植
SOCKADDR\u和
SOCKADDR
结构

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