用c#监控网络流量

监控|流量|网络

   以下的代码的原作是opensource的一个叫sniffer.net的,用vb.net写的,这里只是简单的用c#翻译了一下,暂时还只能监控所有数据包,不能监控某一个进程的数据包,代码如下:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
namespace UpdateTester
{
 /**//// <summary>
 /// Monitor 的摘要说明。
 /// </summary>
 public class Monitor
 {
  public delegate void NewPacketEventHandler(Monitor m, Packet p);
  public event NewPacketEventHandler NewPacket;
  private Socket m_Monitor;
  private IPAddress m_Ip;
  private byte[] m_Buffer = new byte[65535];
  private const System.Int32 IOC_VENDOR = 0x18000000;
  private const int IOC_IN = -2147483648;
  private const int SIO_RCVALL = IOC_IN ^ IOC_VENDOR ^ 1;
  private const int SECURITY_BUILTIN_DOMAIN_RID = 0x20;
  private const int DOMAIN_ALIAS_RID_ADMINS = 0x220;

  public System.Net.IPAddress IP
  {
   get { return m_Ip; }
  }

  public byte[] Buffer
  {
   get { return m_Buffer; }
  }

  public Monitor()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  public Monitor(IPAddress IpAddress)
  {
   if (!(Environment.OSVersion.Platform == PlatformID.Win32NT) && Environment.OSVersion.Version.Major<5)
   {
    throw new NotSupportedException("This program requires Windows 2000, Windows XP or Windows .NET Server!");
   }
   m_Ip = IpAddress;
  }

  public void Start()
  {
   if (m_Monitor==null)
   {
    try
    {
     m_Monitor = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
     m_Monitor.Bind(new IPEndPoint(IP, 0));
     m_Monitor.IOControl(SIO_RCVALL, BitConverter.GetBytes(1), null);
     m_Monitor.BeginReceive(m_Buffer, 0, m_Buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
    }
    catch (Exception e)
    {
     m_Monitor = null;
     throw new SocketException();
    }
   }
  }

  public void Stop()
  {
   if (m_Monitor!=null)
   {
    m_Monitor.Close();
   }
   m_Monitor = null;
  }

  public void OnReceive(System.IAsyncResult ar)
  {
   try
   {
    int received = m_Monitor.EndReceive(ar);

    try
    {
     if (m_Monitor!=null)
     {
      byte[] pkt = new byte[received];
      Array.Copy(Buffer, 0, pkt, 0, received);
      OnNewPacket(new Packet(pkt, DateTime.Now));
     }
    }
    catch(Exception e)
    {
     throw;
    }

    m_Monitor.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
   }
   catch (Exception e)
   {

   }
  }

  protected void OnNewPacket(Packet p)
  {
   NewPacket(this, p);
  }
 }
}

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UpdateTester
{

 public enum Precedence
 {
  Routine = 0,
  Priority = 1,
  Immediate = 2,
  Flash = 3,
  FlashOverride = 4,
  CRITICECP = 5,
  InternetworkControl = 6,
  NetworkControl = 7
 }

 public enum Delay
 {
  NormalDelay = 0,
  LowDelay = 1
 }

 public enum Throughput
 {
  NormalThroughput = 0,
  HighThroughput = 1
 }

 public enum Reliability
 {
  NormalReliability = 0,
  HighReliability = 1
 }

 public enum Protocol
 {
  Ggp = 3,
  Icmp = 1,
  Idp = 22,
  Igmp = 2,
  IP = 4,
  ND = 77,
  Pup = 12,
  Tcp = 6,
  Udp = 17,
  Other = -1
 }
 /**//// <summary>
 /// Packet 的摘要说明。
 /// </summary>
 public class Packet
 {

  private byte[] m_Raw;
  private DateTime m_Time;
  private int m_Version;
  private int m_HeaderLength;
  private Precedence m_Precedence;
  private Delay m_Delay;
  private Throughput m_Throughput;
  private Reliability m_Reliability;
  private int m_TotalLength;
  private int m_Identification;
  private int m_TimeToLive;
  private Protocol m_Protocol;
  private byte[] m_Checksum;
  private string m_SourceAddress;
  private string m_DestinationAddress;
  private int m_SourcePort;
  private int m_DestinationPort;

  public Packet()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  //
  //  public Packet(byte[] raw):(byte[] raw, DateTime time)
  //  {
  //   Packet(raw, DateTime.Now);
  //  }

  public Packet(byte[] raw, DateTime time)
  {
   if (raw==null)
   {
    throw new ArgumentNullException();
   }
   if (raw.Length<20)
   {
    throw new ArgumentException();
   }

   this.m_Raw = raw;
   this.m_Time = time;
   this.m_HeaderLength = (raw[0] & 0xF) * 4;
   if ((raw[0] & 0xF) < 5) {throw new ArgumentException();}
   this.m_Precedence = (Precedence)((raw[1] & 0xE0) >> 5);
   this.m_Delay = (Delay)((raw[1] & 0x10) >> 4);
   this.m_Throughput = (Throughput)((raw[1] & 0x8) >> 3);
   this.m_Reliability = (Reliability)((raw[1] & 0x4) >> 2);
   this.m_TotalLength = raw[2] * 256 + raw[3];
   if ( ! (this.m_TotalLength == raw.Length)) { throw new ArgumentException();} // invalid size of packet;
   this.m_Identification = raw[4] * 256 + raw[5];
   this.m_TimeToLive = raw[8];

   m_Protocol = (Protocol)raw[9];

   m_Checksum = new byte[2];
   m_Checksum[0] = raw[11];
   m_Checksum[1] = raw[10];

   try
   {
    m_SourceAddress = GetIPAddress(raw, 12);
    m_DestinationAddress = GetIPAddress(raw, 16);
   }
   catch (Exception e)
   {
    throw;
   }

   if (m_Protocol == Protocol.Tcp || m_Protocol == Protocol.Udp)
   {
    m_SourcePort = raw[m_HeaderLength] * 256 + raw[m_HeaderLength + 1];
    m_DestinationPort = raw[m_HeaderLength + 2] * 256 + raw[m_HeaderLength + 3];
   }
   else
   {
               
    m_SourcePort = -1;
    m_DestinationPort = -1;
   }
  }

  public string GetIPAddress(byte[] bArray, int nStart)
  {
   byte[] tmp = new byte[4];

   if (bArray.Length > nStart + 2)
   {
    tmp[0] = bArray[nStart];
    tmp[1] = bArray[nStart + 1];
    tmp[2] = bArray[nStart + 2];
    tmp[3] = bArray[nStart + 3];
   }

   return tmp[0] + "." + tmp[1] + "." + tmp[2] + "." + tmp[3];
  }

  public int TotalLength
  {
   get { return m_TotalLength; }
  }

  public DateTime Time
  {
   get { return this.m_Time; }
  }

  public Protocol Protocol
  {
   get { return this.m_Protocol; }
  }

  public string SourceAddress
  {
   get { return this.m_SourceAddress; }
  }

  public string Source
  {
   get
   {
    if ( m_SourcePort != -1 )
    {
     return SourceAddress.ToString() + ":" + m_SourcePort.ToString();
    }
    else
    {
     return SourceAddress.ToString();
    }
   }
  }

  public string Destination
  {
   get
   {
    if (this.m_DestinationPort != -1)
    {
     return DestinationAddress.ToString() + ":" + m_DestinationPort.ToString();
    }
    else
    {
     return DestinationAddress.ToString();
     }
   }
  }

  public string DestinationAddress
  {

   get
   {
    return m_DestinationAddress;
   }
  }
 }
}

在主程序里
private Monitor[] m_PacketMonitors;
  private ArrayList m_Packets;
  private System.Windows.Forms.StatusBar statusBar1;
  private int m_PacketsSize;

执行方法中
private void StartMonitor()
  {
   IPAddress[] hosts = Dns.Resolve(Dns.GetHostName()).AddressList;

   if (hosts.Length == 0) { throw new NotSupportedException("This computer does not have non-loopback interfaces installed!");}
   for (int i=0; i<hosts.Length; i++)
   {
   }

   m_PacketMonitors = new Monitor[1];
   m_Packets = new ArrayList();
   m_PacketMonitors[0] = new Monitor(hosts[0]);

// 添加代理,每次有新的packet到时都出发下面哪个动作
   m_PacketMonitors[0].NewPacket+=new Monitor.NewPacketEventHandler(this.OnNewPacket);
   m_PacketMonitors[0].Start();
  }

// 这个方法用于把packet显示到一个地方

private void OnNewPacket(Monitor m, Packet p)
  {
   m_Packets.Add(p);
   m_PacketsSize += p.TotalLength;
   try
   {
    txtLog.Text += p.Time.ToString()+p.Protocol.ToString()+p.Source.ToString()+p.Destination.ToString()+p.TotalLength.ToString();
 
   }
   catch (Exception e)
   {
    MessageBox.Show(e.Message);
   }

   statusBar1.Text = String.Format("Intercepted {0} packet(s) [{1} bytes]", m_Packets.Count, m_PacketsSize);
  }

时间: 2025-01-07 11:26:27

用c#监控网络流量的相关文章

利用Shell配合绘图工具GnuPlot图形化监控网络流量

网络流量的监控工具有很多,如:Mrtg.Cacti.Zabbix等等,他们都有着各自的特点,不同的侧重,只为适合不同的应用场景的各种特殊需求.除了网络流量监控工具以外,还有Nagios这样的监控主机状态的工具,不仅能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.还能在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知等功能.除此之外Nagios简单地插件设计使得用户可以方便地扩展自己服务的检测方法.也正

运用Ntop监控网络流量(视频Demo)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://chenguang.blog.51cto.com/350944/1329657 运用Ntop监控网络流量 ____网络流量反映了网络的运行状态,是判别网络运行是否正常的关键数据,在实际的网络中,如果对网络流量控制得不好或发生网络拥塞,将会导致网络吞吐量下降.网络性能降低.通过流量测量不仅能反映网络设备(如路由器.交换机等)的工作是否正常,而且能反映出整个网络运行的资源瓶颈,这样管

在 Linux/UNIX 终端下使用 nload 实时监控网络流量和带宽使用

如果你想在命令行界面监控网络吞吐量,nload 应用程序是个不错的选择.它是一个实时监控网络流量和带宽使用的控制台应用程序,使用两个图表可视化地展示接收和发送的流量,并提供诸如数据交换总量.最小/最大网络带宽使用量等附加信息. 安装 在 CentOS/RHEL/Red Hat/Fedora Linux 上安装 nload 首先在 CentOS 或者基于 RHEL 的操作系统上启用 EPEL 仓库,然后键入 yum 命令安装 nload: # yum install nload 在 Debian

Linux系统上安装MRTG来监控网络流量

Multi Router Traffic Grapher------MRTG是一个监控网络链路流量负载的工具软件,通过snmp协议得到设备的流量信息,并将流量负载以包含PNG格式的图形的HTML 文档方式显示给用户,以非常直观的形式显示流量负载. SNMP(imple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理.随后,人们对SGMP进行了很大的修改,特别是加入了符合Internet定义的SMI和MIB:体

linux下监控网络流量的脚本_linux shell

我看了下,linux下的/proc/net/dev记录了每块网卡发送和接受的包和字节数.因此萌生想法,写了一个.运行效果: 复制代码 代码如下: [root@74-82-173-217 ~]# ./net.sh Current Ip: inet addr:74.82.173.217 Bcast:74.82.173.223 Mask:255.255.255.224 Summry info: RX bytes:203692709 (194.2 MiB) TX bytes:93525930 (89.1

在linux中如何通过nload来监控网络使用情况

在linux中如何通过nload来监控网络使用情况 nload 是一个 linux 自由软件工具,通过提供两个简单的图形来帮助linux用户和系统管理员来实时监控网络流量以及宽带使用情况:一个是进入流量,一个是流出流量. 我真的很喜欢用nload来在屏幕上显示当前的下载速度.总的流入量和平均下载速度等信息.nload工具的报告图非常容易理解,最重要的是这些信息真的非常有用. 在其使用手册上说到,在默认情况下它会监控所有网络设备.但是你可以轻松地指定你想要监控的设备,而且可以通过方向键在不同的网络

python如何查看系统网络流量的信息_python

前言 流量信息可以直接在/proc/net/dev中进行查看,笔者实现的程序使用命令: python net.py interface 其中interface为网卡名称,使用什么网卡,电脑有哪些网卡,可以使用 sudo ifconfig 进行查看. Python实现的程序如下: # coding:utf-8 import sys, time, os ''' Inter-| Receive | Transmit face |bytes packets errs drop fifo frame co

给校园网络进行流量监控和流量分析

在我们精心打造的校园网中,如果网络突然缓慢,在重要数据往来的教学时间段,留给系统管理员的响应时间只有宝贵的十几分钟.甚至几分钟.而且,蠕虫病毒对网络速度的影响越来越严重,例如"网络天空"等邮件蠕虫病毒,它们导致被感染的用户只要一连上网就不停地往外发邮件,病毒选择用户个人电脑中的随机文档附加在用户的通讯簿上,通过随机地址进行邮件发送.成百上千的这种垃圾邮件有的排着队往外发送,有的又成批地被退回来堆在服务器上.这都造成个教 育网骨干线路出现明显拥塞,甚至在蠕虫泛滥的局域网中,瘫痪的事件屡有

android l流量监控-android 流量监控 求断开网络连接代码实现

问题描述 android 流量监控 求断开网络连接代码实现 android 流量监控,流量超出时断开网络连接 求断开网络连接代码实现 求代码求逻辑 我找了好久都是监测网络连接状态的,要断开网络连接的代码