高分急求用C#如何使用DhcpEnumSubnetClients函数?感激 高分急求 用C#如何使用DhcpEnumSubnetClients函数?感激 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己解决,代码如下 using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.ComponentModel;using System.Xml;using System.Net;namespace dhcp_enum_clients{ public struct CUSTOM_CLIENT_INFO { public string ClientName; public string IpAddress; public string MacAddress; } [StructLayout(LayoutKind.Sequential)] public struct DHCP_CLIENT_INFO_ARRAY { public uint NumElements; public IntPtr Clients; } [StructLayout(LayoutKind.Sequential)] public struct DHCP_CLIENT_UID { public uint DataLength; public IntPtr Data; } [StructLayout(LayoutKind.Sequential)] public struct DATE_TIME { public uint dwLowDateTime; public uint dwHighDateTime; public DateTime Convert() { if (dwHighDateTime== 0 && dwLowDateTime == 0) { return DateTime.MinValue; } if (dwHighDateTime == int.MaxValue && dwLowDateTime == UInt32.MaxValue) { return DateTime.MaxValue; } return DateTime.FromFileTime((((long) dwHighDateTime) << 32) | (UInt32) dwLowDateTime); } } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct DHCP_HOST_INFO { public uint IpAddress; public string NetBiosName; public string HostName; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct DHCP_CLIENT_INFO { public uint ClientIpAddress; public uint SubnetMask; public DHCP_CLIENT_UID ClientHardwareAddress; //no pointer -> structure !! [MarshalAs(UnmanagedType.LPWStr)] public string ClientName; [MarshalAs(UnmanagedType.LPWStr)] public string ClientComment; public DATE_TIME ClientLeaseExpires; //no pointer -> structure !! public DHCP_HOST_INFO OwnerHost; //no pointer -> structure } class Program { static void Main() { enum_clients("192.168.0.254", "192.168.0.0"); } static void enum_clients(string Server, string Subnet) { string ServerIpAddress = Server; uint Response = 0; uint SubnetMask = StringIPAddressToUInt32(Subnet); IntPtr info_array_ptr; uint ResumeHandle = 0; uint nr_clients_read = 0; uint nr_clients_total = 0; Response = DhcpEnumSubnetClients(ServerIpAddress, SubnetMask, ref ResumeHandle, 65536, out info_array_ptr, ref nr_clients_read, ref nr_clients_total); DHCP_CLIENT_INFO_ARRAY clients = (DHCP_CLIENT_INFO_ARRAY)Marshal.PtrToStructure(info_array_ptr, typeof(DHCP_CLIENT_INFO_ARRAY)); Console.WriteLine(clients.NumElements.ToString()); int size = (int)clients.NumElements; IntPtr[] ptr_array = new IntPtr[size]; IntPtr current = clients.Clients; for (int i = 0; i < size; i++) { ptr_array[i] = Marshal.ReadIntPtr(current); current = (IntPtr)((int)current + (int)Marshal.SizeOf(typeof(IntPtr))); } CUSTOM_CLIENT_INFO[] clients_array = new CUSTOM_CLIENT_INFO[size]; for (int i = 0; i < size; i++) { DHCP_CLIENT_INFO curr_element = (DHCP_CLIENT_INFO)Marshal.PtrToStructure(ptr_array[i], typeof(DHCP_CLIENT_INFO)); clients_array[i].IpAddress = UInt32IPAddressToString(curr_element.ClientIpAddress); clients_array[i].ClientName = curr_element.ClientName; clients_array[i].MacAddress = String.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}", Marshal.ReadByte(curr_element.ClientHardwareAddress.Data), Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 1), Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 2), Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 3), Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 4), Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 5)); //This section will throw an AccessViolationException // Marshal.DestroyStructure(current, typeof(DHCP_CLIENT_INFO)); // current = (IntPtr)((int)current + (int)Marshal.SizeOf(curr_element)); //Replace with: Marshal.DestroyStructure(ptr_array[i], typeof(DHCP_CLIENT_INFO)); } Console.WriteLine(""); } public static uint StringIPAddressToUInt32(string ip_string) { IPAddress IpA = System.Net.IPAddress.Parse(ip_string); byte[] ip_bytes = IpA.GetAddressBytes(); uint ip_uint = (uint)ip_bytes[0] << 24; ip_uint += (uint)ip_bytes[1] << 16; ip_uint += (uint)ip_bytes[2] << 8; ip_uint += (uint)ip_bytes[3]; return ip_uint; } public static string UInt32IPAddressToString(uint ipAddress) { IPAddress ipA = new IPAddress(ipAddress); string[] sIp = ipA.ToString().Split('.'); return sIp[3] + "." + sIp[2] + "." + sIp[1] + "." + sIp[0]; } [DllImport("dhcpsapi.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern uint DhcpEnumSubnetClients( string ServerIpAddress, uint SubnetAddress, ref uint ResumeHandle, uint PreferredMaximum, out IntPtr ClientInfo, ref uint ElementsRead, ref uint ElementsTotal ); }} 第二张贴,敬上100分,DataTable更新数据库,大侠请进 .dat文件传输过来后,将其中的内容传到数据库中 C# 中如何对treeview进行操作? 小白问题:关于 File.Create() 编码问题,急啊.... C# string类处理中文有错误,求助 AcroExch 怎么引用啊! 一个表有一个自增Int类型的ID字段,现在插入一条记录,如何取得插入记录的ID值 如何用C#编写一个设置本地IP地址的程序!(在线等) pongo英雄会 c# 不让用linq winform窗体菜单在数据库中的存储 初学c#,问个数据库连接的问题
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Xml;
using System.Net;namespace dhcp_enum_clients
{
public struct CUSTOM_CLIENT_INFO
{
public string ClientName;
public string IpAddress;
public string MacAddress;
} [StructLayout(LayoutKind.Sequential)]
public struct DHCP_CLIENT_INFO_ARRAY
{
public uint NumElements;
public IntPtr Clients;
} [StructLayout(LayoutKind.Sequential)]
public struct DHCP_CLIENT_UID
{
public uint DataLength;
public IntPtr Data;
} [StructLayout(LayoutKind.Sequential)]
public struct DATE_TIME
{
public uint dwLowDateTime;
public uint dwHighDateTime; public DateTime Convert()
{
if (dwHighDateTime== 0 && dwLowDateTime == 0)
{
return DateTime.MinValue;
}
if (dwHighDateTime == int.MaxValue && dwLowDateTime == UInt32.MaxValue)
{
return DateTime.MaxValue;
}
return DateTime.FromFileTime((((long) dwHighDateTime) << 32) | (UInt32) dwLowDateTime);
}
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DHCP_HOST_INFO
{
public uint IpAddress;
public string NetBiosName;
public string HostName;
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DHCP_CLIENT_INFO
{
public uint ClientIpAddress;
public uint SubnetMask;
public DHCP_CLIENT_UID ClientHardwareAddress; //no pointer -> structure !!
[MarshalAs(UnmanagedType.LPWStr)]
public string ClientName;
[MarshalAs(UnmanagedType.LPWStr)]
public string ClientComment;
public DATE_TIME ClientLeaseExpires; //no pointer -> structure !!
public DHCP_HOST_INFO OwnerHost; //no pointer -> structure
} class Program
{
static void Main()
{
enum_clients("192.168.0.254", "192.168.0.0");
} static void enum_clients(string Server, string Subnet)
{
string ServerIpAddress = Server;
uint Response = 0;
uint SubnetMask = StringIPAddressToUInt32(Subnet);
IntPtr info_array_ptr;
uint ResumeHandle = 0;
uint nr_clients_read = 0;
uint nr_clients_total = 0; Response = DhcpEnumSubnetClients(ServerIpAddress, SubnetMask, ref ResumeHandle,
65536, out info_array_ptr, ref nr_clients_read, ref nr_clients_total); DHCP_CLIENT_INFO_ARRAY clients = (DHCP_CLIENT_INFO_ARRAY)Marshal.PtrToStructure(info_array_ptr, typeof(DHCP_CLIENT_INFO_ARRAY));
Console.WriteLine(clients.NumElements.ToString());
int size = (int)clients.NumElements;
IntPtr[] ptr_array = new IntPtr[size];
IntPtr current = clients.Clients;
for (int i = 0; i < size; i++)
{
ptr_array[i] = Marshal.ReadIntPtr(current);
current = (IntPtr)((int)current + (int)Marshal.SizeOf(typeof(IntPtr)));
}
CUSTOM_CLIENT_INFO[] clients_array = new CUSTOM_CLIENT_INFO[size];
for (int i = 0; i < size; i++)
{
DHCP_CLIENT_INFO curr_element = (DHCP_CLIENT_INFO)Marshal.PtrToStructure(ptr_array[i], typeof(DHCP_CLIENT_INFO));
clients_array[i].IpAddress = UInt32IPAddressToString(curr_element.ClientIpAddress);
clients_array[i].ClientName = curr_element.ClientName;
clients_array[i].MacAddress = String.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}",
Marshal.ReadByte(curr_element.ClientHardwareAddress.Data),
Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 1),
Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 2),
Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 3),
Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 4),
Marshal.ReadByte(curr_element.ClientHardwareAddress.Data, 5)); //This section will throw an AccessViolationException
// Marshal.DestroyStructure(current, typeof(DHCP_CLIENT_INFO));
// current = (IntPtr)((int)current + (int)Marshal.SizeOf(curr_element));
//Replace with:
Marshal.DestroyStructure(ptr_array[i], typeof(DHCP_CLIENT_INFO));
}
Console.WriteLine("");
} public static uint StringIPAddressToUInt32(string ip_string)
{
IPAddress IpA = System.Net.IPAddress.Parse(ip_string);
byte[] ip_bytes = IpA.GetAddressBytes();
uint ip_uint = (uint)ip_bytes[0] << 24;
ip_uint += (uint)ip_bytes[1] << 16;
ip_uint += (uint)ip_bytes[2] << 8;
ip_uint += (uint)ip_bytes[3];
return ip_uint;
} public static string UInt32IPAddressToString(uint ipAddress)
{
IPAddress ipA = new IPAddress(ipAddress);
string[] sIp = ipA.ToString().Split('.'); return sIp[3] + "." + sIp[2] + "." + sIp[1] + "." + sIp[0];
} [DllImport("dhcpsapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern uint DhcpEnumSubnetClients(
string ServerIpAddress,
uint SubnetAddress,
ref uint ResumeHandle,
uint PreferredMaximum,
out IntPtr ClientInfo,
ref uint ElementsRead,
ref uint ElementsTotal
); }
}