酷开电视安装爱奇艺:在C#中调用API获取网络信息和流量
来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 05:51:19
在C#中调用API获取网络信息和流量
开发者在线 Builder.com.cn 更新时间:2007-12-20作者:lc_mtt 来源:CSDN
本文关键词: 流量 网络信息 获取 API 调用 C#
最近一项目中要求显示网络流量,而且必须使用C#。事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量。只是要在C#中实现还是比较复杂。
先看看怎么定义该 API [DllImport("IpHlpApi.dll")]
extern static public uint GetIfTable(byte[] pIfTable, ref uint pdwSize, bool bOrder);
本来想把 pIfTable 定义为 IntPtr,但是这样的结果是,获取的信息是错误的(直到现在都不知是什么原因)。
但显然定义为 byte[] 是不能直接使用的。幸好在 Google Code Search 找到了三个类:
CustomtMarshaler.cs
using System;
using System.IO;
using System.Collections;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
namespace Lemony.SystemInfo
{
/**////
/// CustomMarshaler class implementation.
///
public abstract class CustomMarshaler
{
Fields#region Fields
// The internal buffer
internal byte[] data;
private MemoryStream stream;
private BinaryReader binReader;
private BinaryWriter binWriter;
#endregion
constructors#region constructors
public CustomMarshaler()
{
}
#endregion
public methods#region public methods
public void Deserialize()
{
if (data != null)
{
if (binReader != null)
{
binReader.Close();
stream.Close();
}
// Create a steam from byte array
stream = new MemoryStream(data);
binReader = new BinaryReader(stream, System.Text.Encoding.Unicode);
ReadFromStream(binReader);
binReader.Close();
}
}
public void Serialize()
{
if (data != null)
{
stream = new MemoryStream(data);
binWriter = new BinaryWriter(stream, System.Text.Encoding.Unicode);
WriteToStream(binWriter);
binWriter.Close();
}
}
public int GetSize()
{
int size = 0;
FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (FieldInfo field in fields )
{
if (field.FieldType.IsArray)
{
size += GetFieldSize(field);
}
else if (field.FieldType == typeof(string))
{
size += GetFieldSize(field)*2;
}
else if (field.FieldType.IsPrimitive)
{
size += Marshal.SizeOf(field.FieldType);
}
}
return size;
}
#endregion
properties#region properties
public byte[] ByteArray
{
get
{
return data;
}
}
#endregion
virtual and protected methods#region virtual and protected methods
public virtual void ReadFromStream(BinaryReader reader)
{
object[] param = null;
// Get all public fields
FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
// Loop through the fields
foreach(FieldInfo field in fields)
{
// Retrieve the read method from ReadMethods hashtable
MethodInfo method = (MethodInfo)MarshallingMethods.ReadMethods[field.FieldType];
if (field.FieldType.IsArray)
{
Type element = field.FieldType.GetElementType();
if (element.IsValueType && element.IsPrimitive)
{
if ((element == typeof(char)) || element == typeof(byte))
{
param = new object[1];
param[0] = GetFieldSize(field);
field.SetValue(this, method.Invoke(reader, param));
}
else // any other value type array
{
param = new object[2];
param[0] = reader;
param[1] = GetFieldSize(field);
field.SetValue(this, method.Invoke(null, param));
}
}
else // array of sub structures
{
int size = GetFieldSize(field);
method = (MethodInfo)MarshallingMethods.ReadMethods[typeof(CustomMarshaler)];
Array objArray = Array.CreateInstance(element, size);
for(int i=0;i
objArray.SetValue(Activator.CreateInstance(element), i);
method.Invoke(objArray.GetValue(i), new object[]);
}
field.SetValue(this, objArray);
}
}
else if (field.FieldType == typeof(string))
{
param = new object[2];
param[0] = reader;
param[1] = GetFieldSize(field);
field.SetValue(this, method.Invoke(null, param));
}
else if (field.FieldType.IsValueType && field.FieldType.IsPrimitive)// regular value type
{
field.SetValue(this, method.Invoke(reader, null));
}
else //process substructure
{
CustomMarshaler subStruct = (CustomMarshaler)Activator.CreateInstance(field.FieldType);
subStruct.ReadFromStream(reader);
}
}
}
public virtual void WriteToStream(BinaryWriter writer)
{
object[] param = null;
FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach(FieldInfo field in fields)
{
// Check if we have any value
object value = field.GetValue(this);
MethodInfo method = (MethodInfo)MarshallingMethods.WriteMethods[field.FieldType];
if (field.FieldType.IsArray)
{
Type element = field.FieldType.GetElementType();
if (element.IsValueType && element.IsPrimitive)
{
//method.Invoke(writer, new object[] );
Array arrObject = (Array)field.GetValue(this);
param = new object[2];
param[0] = writer;
param[1] = arrObject;
method.Invoke(null, param);
}
else
{
//Get field size
int size = GetFieldSize(field);
//Get WriteToStream method
method = (MethodInfo)MarshallingMethods.WriteMethods[typeof(CustomMarshaler)];
Array arrObject = (Array)field.GetValue(this);
for(int i=0;i
method.Invoke(arrObject.GetValue(i), new object[]);
}
}
}
else if (field.FieldType == typeof(string))
{
param = new object[3];
param[0] = writer;
param[1] = field.GetValue(this);
param[2] = GetFieldSize(field);
method.Invoke(null, param);
}
else if (field.FieldType.IsValueType && field.FieldType.IsPrimitive)// regular value type
{
method.Invoke(writer, new object[] );
}
}
}
protected int GetFieldSize(FieldInfo field)
{
int size = 0;
CustomMarshalAsAttribute attrib = (CustomMarshalAsAttribute)field.GetCustomAttributes(typeof(CustomMarshalAsAttribute), true)[0];
if (attrib != null)
{
if (attrib.SizeField != null)
{
FieldInfo sizeField = this.GetType().GetField(attrib.SizeField);
size = (int)sizeField.GetValue(this);
}
else
{
size = attrib.SizeConst;
}
}
return size;
}
#endregion
helper methods#region helper methods
private static bool CompareByteArrays (byte[] data1, byte[] data2)
{
// If both are null, they're equal
if (data1==null && data2==null)
{
return true;
}
// If either but not both are null, they're not equal
if (data1==null || data2==null)
{
return false;
}
if (data1.Length != data2.Length)
{
return false;
}
for (int i=0; i < data1.Length; i++)
{
if (data1[i] != data2[i])
{
return false;
}
}
return true;
}
#endregion
}
MarshallingMethods class#region MarshallingMethods class
/**////
/// MarshallingMethods class implementation.
///
public class MarshallingMethods
{
public static Hashtable ReadMethods = new Hashtable();
public static Hashtable WriteMethods = new Hashtable();
constructors#region constructors
static MarshallingMethods()
{
// Read Methods
ReadMethods.Add(typeof(bool), typeof(BinaryReader).GetMethod("ReadBoolean"));
ReadMethods.Add(typeof(byte), typeof(BinaryReader).GetMethod("ReadByte"));
ReadMethods.Add(typeof(System.SByte), typeof(BinaryReader).GetMethod("ReadSByte"));
ReadMethods.Add(typeof(System.Single), typeof(BinaryReader).GetMethod("ReadSingle"));
ReadMethods.Add(typeof(byte[]), typeof(BinaryReader).GetMethod("ReadBytes"));
ReadMethods.Add(typeof(char[]), typeof(BinaryReader).GetMethod("ReadChars"));
ReadMethods.Add(typeof(System.Int16), typeof(BinaryReader).GetMethod("ReadInt16"));
ReadMethods.Add(typeof(System.Int32), typeof(BinaryReader).GetMethod("ReadInt32"));
ReadMethods.Add(typeof(System.UInt16), typeof(BinaryReader).GetMethod("ReadUInt16"));
ReadMethods.Add(typeof(System.UInt32), typeof(BinaryReader).GetMethod("ReadUInt32"));
ReadMethods.Add(typeof(System.String), typeof(MarshallingMethods).GetMethod("ReadString"));
ReadMethods.Add(typeof(System.DateTime), typeof(MarshallingMethods).GetMethod("ReadDateTime"));
ReadMethods.Add(typeof(System.Int16[]), typeof(MarshallingMethods).GetMethod("ReadInt16Array"));
ReadMethods.Add(typeof(System.Int32[]), typeof(MarshallingMethods).GetMethod("ReadInt32Array"));
ReadMethods.Add(typeof(System.UInt16[]), typeof(MarshallingMethods).GetMethod("ReadUInt16Array"));
ReadMethods.Add(typeof(System.UInt32[]), typeof(MarshallingMethods).GetMethod("ReadUInt32Array"));
ReadMethods.Add(typeof(CustomMarshaler), typeof(CustomMarshaler).GetMethod("ReadFromStream"));
//Write Methods
WriteMethods.Add(typeof(bool), typeof(BinaryWriter).GetMethod("Write", new Type[]{typeof(bool)}));
WriteMethods.Add(typeof(byte), typeof(BinaryWriter).GetMethod("Write", new Type[]{typeof(byte)}));
WriteMethods.Add(typeof(System.SByte), typeof(BinaryWriter).GetMethod("Write", new Type[]{typeof(System.SByte)}));
WriteMethods.Add(typeof(System.Single), typeof(BinaryWriter).GetMethod("Write", new Type[]{typeof(System.Single)}));
//WriteMethods.Add(typeof(byte[]), typeof(BinaryWriter).GetMethod("Write", new Type[]));
//WriteMethods.Add(typeof(char[]), typeof(BinaryWriter).GetMethod("Write", new Type[]));
WriteMethods.Add(typeof(System.Int16), typeof(BinaryWriter).GetMethod("Write", new Type[]{typeof(System.Int16)}));
WriteMethods.Add(typeof(System.Int32), typeof(BinaryWriter).GetMethod("Write", new Type[]{typeof(System.Int32)}));
WriteMethods.Add(typeof(System.UInt16), typeof(BinaryWriter).GetMethod("Write", new Type[]{typeof(System.UInt16)}));
WriteMethods.Add(typeof(System.UInt32), typeof(BinaryWriter).GetMethod("Write", new Type[]{typeof(System.UInt32)}));
WriteMethods.Add(typeof(System.String), typeof(MarshallingMethods).GetMethod("WriteString"));
WriteMethods.Add(typeof(CustomMarshaler), typeof(CustomMarshaler).GetMethod("WriteToStream"));
WriteMethods.Add(typeof(bool[]), typeof(MarshallingMethods).GetMethod("WriteArray", new Type[] { typeof(BinaryWriter), typeof(bool[]) }));
WriteMethods.Add(typeof(char[]), typeof(MarshallingMethods).GetMethod("WriteArray", new Type[] { typeof(BinaryWriter), typeof(char[]) }));
WriteMethods.Add(typeof(short[]), typeof(MarshallingMethods).GetMethod("WriteArray", new Type[] { typeof(BinaryWriter), typeof(short[]) }));
WriteMethods.Add(typeof(ushort[]), typeof(MarshallingMethods).GetMethod("WriteArray", new Type[] { typeof(BinaryWriter), typeof(ushort[]) }));
WriteMethods.Add(typeof(int[]), typeof(MarshallingMethods).GetMethod("WriteArray", new Type[] { typeof(BinaryWriter), typeof(int[]) }));
WriteMethods.Add(typeof(uint[]), typeof(MarshallingMethods).GetMethod("WriteArray", new Type[] { typeof(BinaryWriter), typeof(uint[]) }));
WriteMethods.Add(typeof(long[]), typeof(MarshallingMethods).GetMethod("WriteArray", new Type[] { typeof(BinaryWriter), typeof(long[]) }));
WriteMethods.Add(typeof(ulong[]), typeof(MarshallingMethods).GetMethod("WriteArray", new Type[] { typeof(BinaryWriter), typeof(ulong[]) }));
WriteMethods.Add(typeof(float[]), typeof(MarshallingMethods).GetMethod("WriteArray", new Type[] { typeof(BinaryWriter), typeof(float[]) }));
}
#endregion
static helper methods#region static helper methods
public static short[] ReadInt16Array(BinaryReader reader, int count)
{
short[] result = new short[count];
for(int i=0;i
result[i] = reader.ReadInt16();
}
return result;
}
360docimg_501_
360docimg_502_ public static int[] ReadInt32Array(BinaryReader reader, int count)
360docimg_503_360docimg_504_ 360docimg_505_{
360docimg_506_ int[] result = new int[count];
360docimg_507_
360docimg_508_ for(int i=0;i
360docimg_512_ result[i] = reader.ReadInt32();
360docimg_513_ }
360docimg_514_ return result;
360docimg_515_ }
360docimg_516_
360docimg_517_ public static ushort[] ReadUInt16Array(BinaryReader reader, int count)
360docimg_518_360docimg_519_ 360docimg_520_{
360docimg_521_ ushort[] result = new ushort[count];
360docimg_522_
360docimg_523_ for(int i=0;i
360docimg_527_ result[i] = reader.ReadUInt16();
360docimg_528_ }
360docimg_529_ return result;
360docimg_530_ }
360docimg_531_
360docimg_532_ public static uint[] ReadUInt32Array(BinaryReader reader, int count)
360docimg_533_360docimg_534_ 360docimg_535_{
360docimg_536_ uint[] result = new uint[count];
360docimg_537_
360docimg_538_ for(int i=0;i
360docimg_542_ result[i] = reader.ReadUInt32();
360docimg_543_ }
360docimg_544_ return result;
360docimg_545_ }
360docimg_546_
360docimg_547_ public static string ReadString(BinaryReader reader, int count)
360docimg_548_360docimg_549_ 360docimg_550_{
360docimg_551_ string result = "";
360docimg_552_ if (count == 0)
360docimg_553_360docimg_554_ 360docimg_555_{
360docimg_556_ count = 255; //default
360docimg_557_ }
360docimg_558_ char[] data = reader.ReadChars(count);
360docimg_559_
360docimg_560_ result = new string(data).TrimEnd('');
360docimg_561_ return result;
360docimg_562_ }
360docimg_563_
360docimg_564_ public static void WriteString(BinaryWriter writer, string value, int size)
360docimg_565_360docimg_566_ 360docimg_567_{
360docimg_568_ if (value!=null)
360docimg_569_360docimg_570_ 360docimg_571_{
360docimg_572_ byte[] bstring = System.Text.Encoding.Unicode.GetBytes(value.Substring(0, size));
360docimg_573_ writer.Write(bstring);
360docimg_574_ }
360docimg_575_ }
360docimg_576_
360docimg_577_ public static DateTime ReadDateTime(BinaryReader reader)
360docimg_578_360docimg_579_ 360docimg_580_{
360docimg_581_ return DateTime.FromFileTime(reader.ReadInt64());
360docimg_582_ }
360docimg_583_
360docimg_584_
360docimg_585_ public static void WriteArray(BinaryWriter writer, bool[] arr)
360docimg_586_360docimg_587_ 360docimg_588_{
360docimg_589_ for (int i = 0; i < arr.Length; i++)
360docimg_590_360docimg_591_ 360docimg_592_{
360docimg_593_ writer.Write(arr[i]);
360docimg_594_ }
360docimg_595_ }
360docimg_596_ public static void WriteArray(BinaryWriter writer, char[] arr)
360docimg_597_360docimg_598_ 360docimg_599_{
360docimg_600_ for (int i = 0; i < arr.Length; i++)
360docimg_601_360docimg_602_ 360docimg_603_{
360docimg_604_ writer.Write(arr[i]);
360docimg_605_ }
360docimg_606_ }
360docimg_607_
360docimg_608_ public static void WriteArray(BinaryWriter writer, byte[] arr)
360docimg_609_360docimg_610_ 360docimg_611_{
360docimg_612_ for (int i = 0; i < arr.Length; i++)
360docimg_613_360docimg_614_ 360docimg_615_{
360docimg_616_ writer.Write(arr[i]);
360docimg_617_ }
360docimg_618_ }
360docimg_619_
360docimg_620_ public static void WriteArray(BinaryWriter writer, short[] arr)
360docimg_621_360docimg_622_ 360docimg_623_{
360docimg_624_ for (int i = 0; i < arr.Length; i++)
360docimg_625_360docimg_626_ 360docimg_627_{
360docimg_628_ writer.Write(arr[i]);
360docimg_629_ }
360docimg_630_ }
360docimg_631_ public static void WriteArray(BinaryWriter writer, ushort[] arr)
360docimg_632_360docimg_633_ 360docimg_634_{
360docimg_635_ for (int i = 0; i < arr.Length; i++)
360docimg_636_360docimg_637_ 360docimg_638_{
360docimg_639_ writer.Write(arr[i]);
360docimg_640_ }
360docimg_641_ }
360docimg_642_ public static void WriteArray(BinaryWriter writer, int[] arr)
360docimg_643_360docimg_644_ 360docimg_645_{
360docimg_646_ for (int i = 0; i < arr.Length; i++)
360docimg_647_360docimg_648_ 360docimg_649_{
360docimg_650_ writer.Write(arr[i]);
360docimg_651_ }
360docimg_652_ }
360docimg_653_ public static void WriteArray(BinaryWriter writer, uint[] arr)
360docimg_654_360docimg_655_ 360docimg_656_{
360docimg_657_ for (int i = 0; i < arr.Length; i++)
360docimg_658_360docimg_659_ 360docimg_660_{
360docimg_661_ writer.Write(arr[i]);
360docimg_662_ }
360docimg_663_ }
360docimg_664_ public static void WriteArray(BinaryWriter writer, long[] arr)
360docimg_665_360docimg_666_ 360docimg_667_{
360docimg_668_ for (int i = 0; i < arr.Length; i++)
360docimg_669_360docimg_670_ 360docimg_671_{
360docimg_672_ writer.Write(arr[i]);
360docimg_673_ }
360docimg_674_ }
360docimg_675_ public static void WriteArray(BinaryWriter writer, ulong[] arr)
360docimg_676_360docimg_677_ 360docimg_678_{
360docimg_679_ for (int i = 0; i < arr.Length; i++)
360docimg_680_360docimg_681_ 360docimg_682_{
360docimg_683_ writer.Write(arr[i]);
360docimg_684_ }
360docimg_685_ }
360docimg_686_ public static void WriteArray(BinaryWriter writer, float[] arr)
360docimg_687_360docimg_688_ 360docimg_689_{
360docimg_690_ for (int i = 0; i < arr.Length; i++)
360docimg_691_360docimg_692_ 360docimg_693_{
360docimg_694_ writer.Write(arr[i]);
360docimg_695_ }
360docimg_696_ }
360docimg_697_
360docimg_698_ public static void WriteSerializers(BinaryWriter writer, CustomMarshaler[] arr)
360docimg_699_360docimg_700_ 360docimg_701_{
360docimg_702_ for (int i = 0; i < arr.Length; i++)
360docimg_703_360docimg_704_ 360docimg_705_{
360docimg_706_ arr[i].WriteToStream(writer);
360docimg_707_ }
360docimg_708_ }
360docimg_709_
360docimg_710_ #endregion
360docimg_711_ }
360docimg_712_
360docimg_713_ #endregion
360docimg_714_
360docimg_715_360docimg_716_ CustomMarshalAsAttribute#region CustomMarshalAsAttribute
360docimg_717_360docimg_718_ /**////
360docimg_719_ /// CustomMarshalAsAttribute implementaion.
360docimg_720_ ///
360docimg_721_ public sealed class CustomMarshalAsAttribute : Attribute
360docimg_722_360docimg_723_ 360docimg_724_{
360docimg_725_ public int SizeConst = 0;
360docimg_726_ public string SizeField = null;
360docimg_727_ }
360docimg_728_
360docimg_729_ #endregion
360docimg_730_
360docimg_731_}
360docimg_732_
360docimg_733_360docimg_734_MIB_IFROW.cs
360docimg_735_using System;
360docimg_736_using System.Collections.Generic;
360docimg_737_using System.Text;
360docimg_738_
360docimg_739_namespace Lemony.SystemInfo
360docimg_740_360docimg_741_360docimg_742_{
360docimg_743_ public class MIB_IFROW : CustomMarshaler
360docimg_744_360docimg_745_ 360docimg_746_{
360docimg_747_ [CustomMarshalAs(SizeConst = MAX_INTERFACE_NAME_LEN)]
360docimg_748_ public string wszName;
360docimg_749_ public uint dwIndex; // index of the interface
360docimg_750_ public uint dwType; // type of interface
360docimg_751_ public uint dwMtu; // max transmission unit
360docimg_752_ public uint dwSpeed; // speed of the interface
360docimg_753_ public uint dwPhysAddrLen; // length of physical address
360docimg_754_ [CustomMarshalAs(SizeConst = MAXLEN_PHYSADDR)]
360docimg_755_ public byte[] bPhysAddr; // physical address of adapter
360docimg_756_ public uint dwAdminStatus; // administrative status
360docimg_757_ public uint dwOperStatus; // operational status
360docimg_758_ public uint dwLastChange; // last time operational status changed
360docimg_759_ public uint dwInOctets; // octets received
360docimg_760_ public uint dwInUcastPkts; // unicast packets received
360docimg_761_ public uint dwInNUcastPkts; // non-unicast packets received
360docimg_762_ public uint dwInDiscards; // received packets discarded
360docimg_763_ public uint dwInErrors; // erroneous packets received
360docimg_764_ public uint dwInUnknownProtos; // unknown protocol packets received
360docimg_765_ public uint dwOutOctets; // octets sent
360docimg_766_ public uint dwOutUcastPkts; // unicast packets sent
360docimg_767_ public uint dwOutNUcastPkts; // non-unicast packets sent
360docimg_768_ public uint dwOutDiscards; // outgoing packets discarded
360docimg_769_ public uint dwOutErrors; // erroneous packets sent
360docimg_770_ public uint dwOutQLen; // output queue length
360docimg_771_ public uint dwDescrLen; // length of bDescr member
360docimg_772_ [CustomMarshalAs(SizeConst = MAXLEN_IFDESCR)]
360docimg_773_ public byte[] bDescr; // interface description
360docimg_774_
360docimg_775_ private const int MAX_INTERFACE_NAME_LEN = 256;
360docimg_776_ private const int MAXLEN_PHYSADDR = 8;
360docimg_777_ private const int MAXLEN_IFDESCR = 256;
360docimg_778_ private const int MAX_ADAPTER_NAME = 128;
360docimg_779_ }
360docimg_780_}
360docimg_781_
360docimg_782_360docimg_783_MIB_IFTABLE.cs
360docimg_784_using System;
360docimg_785_using System.Collections.Generic;
360docimg_786_using System.Text;
360docimg_787_
360docimg_788_namespace Lemony.SystemInfo
360docimg_789_360docimg_790_360docimg_791_{
360docimg_792_360docimg_793_ /**////
360docimg_794_ /// IFTable
360docimg_795_ ///
360docimg_796_ public class MIB_IFTABLE : CustomMarshaler
360docimg_797_360docimg_798_ 360docimg_799_{
360docimg_800_ public int dwNumEntries;
360docimg_801_ [CustomMarshalAs(SizeField = "dwNumEntries")]
360docimg_802_ public MIB_IFROW[] Table;
360docimg_803_
360docimg_804_ public MIB_IFTABLE()
360docimg_805_360docimg_806_ 360docimg_807_{
360docimg_808_ this.data = new byte[this.GetSize()];
360docimg_809_ }
360docimg_810_
360docimg_811_ public MIB_IFTABLE(int size)
360docimg_812_360docimg_813_ 360docimg_814_{
360docimg_815_ this.data = new byte[size];
360docimg_816_ }
360docimg_817_ }
360docimg_818_}
360docimg_819_
再定义一个 NetInfo 类,存储网络信息
360docimg_820_360docimg_821_NetInfo.cs
360docimg_822_using System;
360docimg_823_using System.Collections.Generic;
360docimg_824_using System.Text;
360docimg_825_using System.Runtime.InteropServices;
360docimg_826_
360docimg_827_
360docimg_828_namespace Lemony.SystemInfo
360docimg_829_360docimg_830_360docimg_831_{
360docimg_832_360docimg_833_ /**////
360docimg_834_ /// 网络类型
360docimg_835_ ///
360docimg_836_ public enum NetType
360docimg_837_360docimg_838_ 360docimg_839_{
360docimg_840_ Other = 1,
360docimg_841_ Ethernet = 6,
360docimg_842_ Tokenring = 9,
360docimg_843_ FDDI = 15,
360docimg_844_ PPP = 23,
360docimg_845_ Loopback = 24,
360docimg_846_ Slip = 28
360docimg_847_ };
360docimg_848_
360docimg_849_360docimg_850_ /**////
360docimg_851_ /// 网络状态
360docimg_852_ ///
360docimg_853_ public enum NetState
360docimg_854_360docimg_855_ 360docimg_856_{
360docimg_857_ NotOperational = 0,
360docimg_858_ Operational = 1,
360docimg_859_ Disconnected = 2,
360docimg_860_ Connecting = 3,
360docimg_861_ Connected = 4,
360docimg_862_ Unreachable = 5
360docimg_863_ };
360docimg_864_
360docimg_865_360docimg_866_ /**////
360docimg_867_ /// 网络信息类
360docimg_868_ ///
360docimg_869_ public class NetInfo
360docimg_870_360docimg_871_ 360docimg_872_{
360docimg_873_ public NetInfo()
360docimg_874_360docimg_875_ 360docimg_876_{
360docimg_877_ }
360docimg_878_
360docimg_879_ private string m_Name;
360docimg_880_360docimg_881_ /**////
360docimg_882_ /// 名称
360docimg_883_ ///
360docimg_884_ public string Name
360docimg_885_360docimg_886_ 360docimg_887_{
360docimg_888_360docimg_889_ get 360docimg_890_{ return m_Name; }
360docimg_891_360docimg_892_ set 360docimg_893_{ m_Name = value; }
360docimg_894_ }
360docimg_895_
360docimg_896_ private uint m_Index;
360docimg_897_360docimg_898_ /**////
360docimg_899_ /// 有效编号
360docimg_900_ ///
360docimg_901_ public uint Index
360docimg_902_360docimg_903_ 360docimg_904_{
360docimg_905_360docimg_906_ get 360docimg_907_{ return m_Index; }
360docimg_908_360docimg_909_ set 360docimg_910_{ m_Index = value; }
360docimg_911_ }
360docimg_912_
360docimg_913_ private NetType m_Type;
360docimg_914_360docimg_915_ /**////
360docimg_916_ /// 类型
360docimg_917_ ///
360docimg_918_ public NetType Type
360docimg_919_360docimg_920_ 360docimg_921_{
360docimg_922_360docimg_923_ get 360docimg_924_{ return m_Type; }
360docimg_925_360docimg_926_ set 360docimg_927_{ m_Type = value; }
360docimg_928_ }
360docimg_929_
360docimg_930_ private uint m_Speed;
360docimg_931_360docimg_932_ /**////
360docimg_933_ /// 速度
360docimg_934_ ///
360docimg_935_ public uint Speed
360docimg_936_360docimg_937_ 360docimg_938_{
360docimg_939_360docimg_940_ get 360docimg_941_{ return m_Speed; }
360docimg_942_360docimg_943_ set 360docimg_944_{ m_Speed = value; }
360docimg_945_ }
360docimg_946_
360docimg_947_ private uint m_InOctets;
360docimg_948_360docimg_949_ /**////
360docimg_950_ /// 总接收字节数
360docimg_951_ ///
360docimg_952_ public uint InOctets
360docimg_953_360docimg_954_ 360docimg_955_{
360docimg_956_360docimg_957_ get 360docimg_958_{ return m_InOctets; }
360docimg_959_360docimg_960_ set 360docimg_961_{ m_InOctets = value; }
360docimg_962_ }
360docimg_963_
360docimg_964_ private uint m_OutOctets;
360docimg_965_360docimg_966_ /**////
360docimg_967_ /// 总发送字节数
360docimg_968_ ///
360docimg_969_ public uint OutOctets
360docimg_970_360docimg_971_ 360docimg_972_{
360docimg_973_360docimg_974_ get 360docimg_975_{ return m_OutOctets; }
360docimg_976_360docimg_977_ set 360docimg_978_{ m_OutOctets = value; }
360docimg_979_ }
360docimg_980_
360docimg_981_ private NetState m_Status;
360docimg_982_360docimg_983_ /**////
360docimg_984_ /// 操作状态
360docimg_985_ ///
360docimg_986_ public NetState Status
360docimg_987_360docimg_988_ 360docimg_989_{
360docimg_990_360docimg_991_ get 360docimg_992_{ return m_Status; }
360docimg_993_360docimg_994_ set 360docimg_995_{ m_Status = value; }
360docimg_996_ }
360docimg_997_
360docimg_998_ private uint m_InErrors;
360docimg_999_360docimg_1000_ /**////
360docimg_1001_ /// 总错收字节数
360docimg_1002_ ///
360docimg_1003_ public uint InErrors
360docimg_1004_360docimg_1005_ 360docimg_1006_{
360docimg_1007_360docimg_1008_ get 360docimg_1009_{ return m_InErrors; }
360docimg_1010_360docimg_1011_ set 360docimg_1012_{ m_InErrors = value; }
360docimg_1013_ }
360docimg_1014_
360docimg_1015_ private uint m_OutErrors;
360docimg_1016_360docimg_1017_ /**////
360docimg_1018_ /// 总错发字节数
360docimg_1019_ ///
360docimg_1020_ public uint OutErrors
360docimg_1021_360docimg_1022_ 360docimg_1023_{
360docimg_1024_360docimg_1025_ get 360docimg_1026_{ return m_OutErrors; }
360docimg_1027_360docimg_1028_ set 360docimg_1029_{ m_OutErrors = value; }
360docimg_1030_ }
360docimg_1031_
360docimg_1032_ private uint m_InUnknownProtos;
360docimg_1033_360docimg_1034_ /**////
360docimg_1035_ /// 未知协议共收字节数
360docimg_1036_ ///
360docimg_1037_ public uint InUnknownProtos
360docimg_1038_360docimg_1039_ 360docimg_1040_{
360docimg_1041_360docimg_1042_ get 360docimg_1043_{ return m_InUnknownProtos; }
360docimg_1044_360docimg_1045_ set 360docimg_1046_{ m_InUnknownProtos = value; }
360docimg_1047_ }
360docimg_1048_
360docimg_1049_ private string m_PhysAddr;
360docimg_1050_360docimg_1051_ /**////
360docimg_1052_ /// 物理地址
360docimg_1053_ ///
360docimg_1054_ public string PhysAddr
360docimg_1055_360docimg_1056_ 360docimg_1057_{
360docimg_1058_360docimg_1059_ get 360docimg_1060_{ return m_PhysAddr; }
360docimg_1061_360docimg_1062_ set 360docimg_1063_{ m_PhysAddr = value; }
360docimg_1064_ }
360docimg_1065_
360docimg_1066_ }
360docimg_1067_}
360docimg_1068_
OK,现在可以获取网络信息了
360docimg_1069_360docimg_1070_ /**////
360docimg_1071_ /// Get IFTable
360docimg_1072_ ///
360docimg_1073_ ///
360docimg_1074_ private static MIB_IFTABLE GetAllIfTable()
360docimg_1075_360docimg_1076_ 360docimg_1077_{
360docimg_1078_ //缓冲区大小
360docimg_1079_ uint dwSize = 0;
360docimg_1080_
360docimg_1081_ //获取缓冲区大小
360docimg_1082_ uint ret = GetIfTable(null, ref dwSize, false);
360docimg_1083_ if (ret == 50)
360docimg_1084_360docimg_1085_ 360docimg_1086_{
360docimg_1087_ //此函数仅支持于 win98/nt 系统
360docimg_1088_ return null;
360docimg_1089_ }
360docimg_1090_
360docimg_1091_ //定义,获取 MIB_IFTABLE 对象
360docimg_1092_ MIB_IFTABLE tbl = new MIB_IFTABLE((int)dwSize);
360docimg_1093_ ret = GetIfTable(tbl.ByteArray, ref dwSize, false);
360docimg_1094_
360docimg_1095_ //如果不成功
360docimg_1096_ if (ret != 0)
360docimg_1097_360docimg_1098_ 360docimg_1099_{
360docimg_1100_ return null;
360docimg_1101_ }
360docimg_1102_
360docimg_1103_ return tbl;
360docimg_1104_ }
360docimg_1105_
360docimg_1106_360docimg_1107_ /**////
360docimg_1108_ /// Get NetInfo Class
360docimg_1109_ ///
360docimg_1110_ /// MIB_IFROW Class
360docimg_1111_ ///
360docimg_1112_ private static NetInfo GetNetInfo(MIB_IFROW row)
360docimg_1113_360docimg_1114_ 360docimg_1115_{
360docimg_1116_ NetInfo ninfo = new NetInfo();
360docimg_1117_ ninfo.Index = row.dwIndex;
360docimg_1118_ ninfo.Name = Encoding.ASCII.GetString(row.bDescr, 0, (int)row.dwDescrLen);
360docimg_1119_ ninfo.PhysAddr = GetPhysAddr(row.bPhysAddr, (int)row.dwPhysAddrLen);
360docimg_1120_ ninfo.Type = (NetType)row.dwType;
360docimg_1121_ ninfo.Status = (NetState)row.dwOperStatus;
360docimg_1122_ ninfo.Speed = row.dwSpeed;
360docimg_1123_ ninfo.InErrors = row.dwInErrors;
360docimg_1124_ ninfo.InOctets = row.dwInOctets;
360docimg_1125_ ninfo.InUnknownProtos = row.dwInUnknownProtos;
360docimg_1126_ ninfo.OutErrors = row.dwOutErrors;
360docimg_1127_ ninfo.OutOctets = row.dwOutOctets;
360docimg_1128_ return ninfo;
360docimg_1129_ }
360docimg_1130_360docimg_1131_/**////
360docimg_1132_ /// 获取所有的网络信息
360docimg_1133_ ///
360docimg_1134_ ///
360docimg_1135_ public static List
360docimg_1136_360docimg_1137_ 360docimg_1138_{
360docimg_1139_ //定义范型
360docimg_1140_ List
360docimg_1141_
360docimg_1142_ //定义,获取 MIB_IFTABLE 对象
360docimg_1143_ MIB_IFTABLE tbl = GetAllIfTable();
360docimg_1144_
360docimg_1145_ //如果成功
360docimg_1146_ if (tbl != null)
360docimg_1147_360docimg_1148_ 360docimg_1149_{
360docimg_1150_ tbl.Deserialize();
360docimg_1151_ for (int i = 0; i < tbl.Table.Length; i++)
360docimg_1152_360docimg_1153_ 360docimg_1154_{
360docimg_1155_ ninfos.Add(GetNetInfo(tbl.Table[i]));
360docimg_1156_ }
360docimg_1157_ }
360docimg_1158_
360docimg_1159_ return ninfos;
360docimg_1160_ }
PS:事实上,我把获取网络、CPU、内存、磁盘、进程信息等功能封装起来,并做了一个比较完善的 Windows 任务管理器,整理完后发布源码。
查看本文来源
在C#中调用API获取网络信息和流量
在C#中如何调用dll文件
C#调用Google Earth COM API开发1(一)
C#调用Google Earth COM API开发(一)1
在 C# 中通过 P/Invoke 调用Win32 DLL - benben - Java...
在C#中使用WIA获取扫描仪数据(三、利用Filter处理图片) - carekee - ...
获取和设置c# 应用程序目录
在VC中调用 WebService
C#中获取文件路径、DataGridView显示行号1
植物在闪电中获取水和氮营养
四下信息 第1课 生活在网络中
【转】在VB应用程序中调用Excel2000
利用hook截获进程的API调用
基础类的DSP/BIOS API调用
从.NET平台调用Win32 API
老生常谈之C++和C#之间互相调用 - gangyilovevc的专栏 - CSDN博客
在Java中获取环境变量
在C#程序中实现插件架构
C#中类和结构的区别
C#中动态加载和卸载DLL
C#如何快速获取助记码
C#调用Java类的方法
VB Windows API 获取窗口句柄
从会计中期报告中获取关键信息