在C#中调用API获取网络信息和流量-阿里云开发者社区

开发者社区> 杰克.陈> 正文

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

简介: 原文 在C#中调用API获取网络信息和流量  最近一项目中要求显示网络流量,而且必须使用C#。 事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量。
+关注继续查看

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

最近一项目中要求显示网络流量,而且必须使用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 找到了三个类:




再定义一个 NetInfo 类,存储网络信息


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 任务管理器,整理完后发布源码。

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
无影云桌面让你无处不在
云桌面,让你不再为了没有电脑发愁。手把手教你玩通无影~~~
18 0
第一期体验印象最深的地方
第一期体验印象最深的地方
17 0
Caffeine缓存 最快缓存 内存缓存
Caffeine是一个进程内部缓存框架 最快缓存 内存缓存
11 0
SQL必知必会(一)
对于我们而言,数据库是一个以某种有组织的方式存储的数据集合。最简单的办法就是将数据库想象成一个文件柜。这个文件柜是一个存放数据的物理位置,不管数据是什么,也不管数据是如何组织的。 数据库(DataBase) 保存有组织数据的容器(通常为一个或一组文件)
16 0
ACP实战特训营RDS(DAY3)
要点记录 1. PolarDB的基本概念 1.1、对比单机数据库优势有哪些:简单易用、极致性能、降低成本、海量存储、安全可靠、快速弹性 1.2 、单机数据库容量瓶颈-单机数据库扩展困难-数据库使用成本过高-分布式数据库应用开发繁琐 2. PolarDB产品系列:集群版-单节点-历史库-多主架构 2.1、集群:一个集群包含一个主节点和多个读节点,最多16个节点,即一个主节点和15个只读节点 2.2、地域:是指物理的数据中心,一般情况下,PolarDB集群应该和ECS实例位于同一地域,以实现最高的访问性能
9 0
SQL必知必会(二)
表中的数据都是按行来存储的,所保存的每个记录存储在自己的行内。如果将表想象为网格,网格中垂直的列为表列,水平行为表行。
17 0
云起第一期学习体会(报告)
云起第一期学习体会(报告)
16 0
产业白热化竞争来临,看人工智能如何带动经济数智化发展
人工智能的发展主要围绕着语言、数学和逻辑推理能力的进步。未来,人工智能的将围绕提升预测准确性和情商能力而发展,为行业数智化转型带来层层浪潮。
12 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载