且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在C#中调用API获取网络信息和流量

更新时间:2022-10-09 16:17:00

最近一项目中要求显示网络流量,而且必须使用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获取网络信息和流量                return null;
在C#中调用API获取网络信息和流量            }
在C#中调用API获取网络信息和流量
在C#中调用API获取网络信息和流量            return tbl;
在C#中调用API获取网络信息和流量        }
在C#中调用API获取网络信息和流量
在C#中调用API获取网络信息和流量        /// <summary>
在C#中调用API获取网络信息和流量        /// Get NetInfo Class
在C#中调用API获取网络信息和流量        /// </summary>
在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获取网络信息和流量        /// </summary>
在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获取网络信息和流量            //定义,获取 MIB_IFTABLE 对象
在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 任务管理器,整理完后发布源码。