天天看點

在C#中調用API擷取網絡資訊和流量

最近一項目中要求顯示網絡流量,而且必須使用C#。

事實上,調用 IpHlpApi.dll 的 GetIfTable API 可以輕易獲得網絡資訊和網絡流量。隻是要在C#中實作還是比較複雜。

先看看怎麼定義該 API

在C#中調用API擷取網絡資訊和流量

[DllImport("IpHlpApi.dll")]

在C#中調用API擷取網絡資訊和流量

        extern static public uint GetIfTable(byte[] pIfTable, ref uint pdwSize, bool bOrder);

本來想把 pIfTable 定義為 IntPtr,但是這樣的結果是,擷取的資訊是錯誤的(直到現在都不知是什麼原因)。

但顯然定義為 byte[] 是不能直接使用的。幸好在 Google Code Search 找到了三個類:

在C#中調用API擷取網絡資訊和流量

CustomtMarshaler.cs

在C#中調用API擷取網絡資訊和流量

MIB_IFROW.cs

在C#中調用API擷取網絡資訊和流量

MIB_IFTABLE.cs

再定義一個 NetInfo 類,存儲網絡資訊

在C#中調用API擷取網絡資訊和流量

NetInfo.cs

OK,現在可以擷取網絡資訊了

在C#中調用API擷取網絡資訊和流量

        /// <summary>

在C#中調用API擷取網絡資訊和流量

        /// Get IFTable

在C#中調用API擷取網絡資訊和流量

        /// </summary>

在C#中調用API擷取網絡資訊和流量

        /// <returns>MIB_IFTABLE Class</returns>

在C#中調用API擷取網絡資訊和流量

        private static MIB_IFTABLE GetAllIfTable()

在C#中調用API擷取網絡資訊和流量

        {

在C#中調用API擷取網絡資訊和流量

            //緩沖區大小

在C#中調用API擷取網絡資訊和流量

            uint dwSize = 0;

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

            //擷取緩沖區大小

在C#中調用API擷取網絡資訊和流量

            uint ret = GetIfTable(null, ref dwSize, false);

在C#中調用API擷取網絡資訊和流量

            if (ret == 50)

在C#中調用API擷取網絡資訊和流量

            {

在C#中調用API擷取網絡資訊和流量

                //此函數僅支援于 win98/nt 系統

在C#中調用API擷取網絡資訊和流量

                return null;

在C#中調用API擷取網絡資訊和流量

            }

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

            //定義,擷取 MIB_IFTABLE 對象

在C#中調用API擷取網絡資訊和流量

            MIB_IFTABLE tbl = new MIB_IFTABLE((int)dwSize);

在C#中調用API擷取網絡資訊和流量

            ret = GetIfTable(tbl.ByteArray, ref dwSize, false);

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

            //如果不成功

在C#中調用API擷取網絡資訊和流量

            if (ret != 0)

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

            return tbl;

在C#中調用API擷取網絡資訊和流量

        }

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

        /// Get NetInfo Class

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

        /// <param name="row">MIB_IFROW Class</param>

在C#中調用API擷取網絡資訊和流量

        /// <returns>NetInfo Class</returns>

在C#中調用API擷取網絡資訊和流量

        private static NetInfo GetNetInfo(MIB_IFROW row)

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

            NetInfo ninfo = new NetInfo();

在C#中調用API擷取網絡資訊和流量

            ninfo.Index = row.dwIndex;

在C#中調用API擷取網絡資訊和流量

            ninfo.Name = Encoding.ASCII.GetString(row.bDescr, 0, (int)row.dwDescrLen);

在C#中調用API擷取網絡資訊和流量

            ninfo.PhysAddr = GetPhysAddr(row.bPhysAddr, (int)row.dwPhysAddrLen);

在C#中調用API擷取網絡資訊和流量

            ninfo.Type = (NetType)row.dwType;

在C#中調用API擷取網絡資訊和流量

            ninfo.Status = (NetState)row.dwOperStatus;

在C#中調用API擷取網絡資訊和流量

            ninfo.Speed = row.dwSpeed;

在C#中調用API擷取網絡資訊和流量

            ninfo.InErrors = row.dwInErrors;

在C#中調用API擷取網絡資訊和流量

            ninfo.InOctets = row.dwInOctets;

在C#中調用API擷取網絡資訊和流量

            ninfo.InUnknownProtos = row.dwInUnknownProtos;

在C#中調用API擷取網絡資訊和流量

            ninfo.OutErrors = row.dwOutErrors;

在C#中調用API擷取網絡資訊和流量

            ninfo.OutOctets = row.dwOutOctets;

在C#中調用API擷取網絡資訊和流量

            return ninfo;

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

/// <summary>

在C#中調用API擷取網絡資訊和流量

        /// 擷取所有的網絡資訊

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

        /// <returns>NetInfo 網絡資訊範型</returns>

在C#中調用API擷取網絡資訊和流量

        public static List<NetInfo> GetAllNetInfo()

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

            //定義範型

在C#中調用API擷取網絡資訊和流量

            List<NetInfo> ninfos = new List<NetInfo>();

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

            MIB_IFTABLE tbl = GetAllIfTable();

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

            //如果成功

在C#中調用API擷取網絡資訊和流量

            if (tbl != null)

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

                tbl.Deserialize();

在C#中調用API擷取網絡資訊和流量

                for (int i = 0; i < tbl.Table.Length; i++)

在C#中調用API擷取網絡資訊和流量

                {

在C#中調用API擷取網絡資訊和流量

                    ninfos.Add(GetNetInfo(tbl.Table[i]));

在C#中調用API擷取網絡資訊和流量

                }

在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量
在C#中調用API擷取網絡資訊和流量

            return ninfos;

在C#中調用API擷取網絡資訊和流量

PS:事實上,我把擷取網絡、CPU、記憶體、磁盤、程序資訊等功能封裝起來,并做了一個比較完善的 Windows 任務管理器,整理完後釋出源碼。

繼續閱讀