博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在C#中调用API获取网络信息和流量
阅读量:7071 次
发布时间:2019-06-28

本文共 2021 字,大约阅读时间需要 6 分钟。

最近一项目中要求显示网络流量,而且必须使用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 null;
            }
            return tbl;
        }
        /// <summary>
        /// Get NetInfo Class
        /// </summary>
        /// <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>
        /// 获取所有的网络信息
        /// </summary>
        /// <returns>NetInfo 网络信息范型</returns>
        public static List<NetInfo> GetAllNetInfo()
        {
            //定义范型
            List<NetInfo> ninfos = new List<NetInfo>();
            //定义,获取 MIB_IFTABLE 对象
            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 任务管理器,整理完后发布源码。

你可能感兴趣的文章
布局(2、相对布局)
查看>>
在 Eclipse 上配置tomcat7.0并创建工程发布
查看>>
腾讯移动分析 签名代码示例
查看>>
重新回归博客园,写在开始的话。
查看>>
JavaScript定义函数
查看>>
AJAX的基础
查看>>
安全使用电子邮件十三法
查看>>
开发人员必知的20+HTML5技巧
查看>>
组合数学
查看>>
Loadrunner如何添加负载机
查看>>
Vue中组件之间的通信方式
查看>>
数据库并行读取和写入(Python实现)
查看>>
Spring学习(15)--- 基于Java类的配置Bean 之 @Bean & @Scope 注解
查看>>
英语写作-----赖世雄<<突破英语写作关>>笔记
查看>>
MySQL批量导出以某数字或字母开头的表
查看>>
java变长参数
查看>>
状态和面向对象编程——2.状态介绍
查看>>
html -- 实体
查看>>
SVN中的check out与export的区别
查看>>
如何重新注册VMware Update Manager(VUM)至vCenter Server中
查看>>