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