我正在尝试重写一些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 ++编码器所以如果有人能指出我正确的方向...
答案 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_IN
,SOCKADDR_IN6
和SOCKADDR
结构。