最近一項目中要求顯示網絡流量,而且必須使用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
MIB_IFROW.cs
MIB_IFTABLE.cs
再定義一個 NetInfo 類,存儲網絡資訊
NetInfo.cs
OK,現在可以擷取網絡資訊了
/// <summary>
/// Get IFTable
/// </summary>
/// <returns>MIB_IFTABLE Class</returns>

private static MIB_IFTABLE GetAllIfTable()
{
//緩沖區大小
uint dwSize = 0;
//擷取緩沖區大小
uint ret = GetIfTable(null, ref dwSize, false);
if (ret == 50)
{
//此函數僅支援于 win98/nt 系統
return null;
}
//定義,擷取 MIB_IFTABLE 對象
MIB_IFTABLE tbl = new MIB_IFTABLE((int)dwSize);
ret = GetIfTable(tbl.ByteArray, ref dwSize, false);
//如果不成功
if (ret != 0)
return tbl;
}

/// Get NetInfo Class
/// <param name="row">MIB_IFROW Class</param>
/// <returns>NetInfo Class</returns>

private static NetInfo GetNetInfo(MIB_IFROW row)
NetInfo ninfo = new NetInfo();
ninfo.Index = row.dwIndex;
ninfo.Name = Encoding.ASCII.GetString(row.bDescr, 0, (int)row.dwDescrLen);
ninfo.PhysAddr = GetPhysAddr(row.bPhysAddr, (int)row.dwPhysAddrLen);
ninfo.Type = (NetType)row.dwType;
ninfo.Status = (NetState)row.dwOperStatus;
ninfo.Speed = row.dwSpeed;
ninfo.InErrors = row.dwInErrors;
ninfo.InOctets = row.dwInOctets;
ninfo.InUnknownProtos = row.dwInUnknownProtos;
ninfo.OutErrors = row.dwOutErrors;
ninfo.OutOctets = row.dwOutOctets;
return ninfo;
/// <summary>
/// 擷取所有的網絡資訊
/// <returns>NetInfo 網絡資訊範型</returns>

public static List<NetInfo> GetAllNetInfo()
//定義範型
List<NetInfo> ninfos = new List<NetInfo>();
MIB_IFTABLE tbl = GetAllIfTable();
//如果成功
if (tbl != null)
tbl.Deserialize();
for (int i = 0; i < tbl.Table.Length; i++)
{
ninfos.Add(GetNetInfo(tbl.Table[i]));
}
return ninfos;
PS:事實上,我把擷取網絡、CPU、記憶體、磁盤、程序資訊等功能封裝起來,并做了一個比較完善的 Windows 任務管理器,整理完後釋出源碼。