转自:http://hi.baidu.com/boyxgb/blog/item/89ac86fbdff5f82c4e4aea2e.html

由于项目的需要,要从终端与服务器的通讯数据中获取终端硬件状态,所以用到了广为流传的C#抓包库SharpPcap。
SharpPcap目前最新版本是3.1.0,基于.Net 3.5和WinPcap。这儿请注意,如果你用的版本和我的版本差别太大,就不需要浪费时间看这篇文章了。比方说你用的是基于.Net 2.0的旧版,库完全不一样,请搜索SharpPcap,旧版SharpPcap的文章还是挺多的,或者你用的是最新的版本,那请直接参考SharpPcap下载网站的最新版source包里的examples中的内容。
在使用前首先需要安装WinPcap,下载地址:http://www.winpcap.org/install/default.htm
SharpPcap下载地址:http://sourceforge.net/projects/sharppcap/,下载SharpPcap dll库包SharpPcap-3.1.0.bin.zip,同样也可以在files里找到对应的source包SharpPcap-3.1.0.src.zip和SharpPcap历史版本。
SharpPcap库下载之解压后,直接在项目中引用SharpPcap.dll和PacketDotNet.dll即可使用了。

下面贴我整理出来的SharpPcap的示例大全的代码,其实也就是把source包examples中的官方示例里我所用得上的内容整合在了一起(不包括ARP、DumpFile和MultipleFilters):

代码
using System;
 using System.Collections.Generic;
 using System.Linq;;//需要添加引用System.Core(右键项的引用添加,在.net项可以找到)
using System.Text;
using SharpPcap;//需要添加引用SharpPcap.dll和PacketDotNet.dll

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            //显示SharpPcap版本
            string ver = SharpPcap.Version.VersionString;
            Console.WriteLine("SharpPcap {0}", ver);

            //获取网络设备
            LivePcapDeviceList devices = LivePcapDeviceList.Instance;
            )
            {
                Console.WriteLine("找不到网络设备");
                return;
            }
            Console.WriteLine();
            Console.WriteLine("以下是目前本计算机上的活动网络设备:");
            Console.WriteLine("----------------------------------------------------");
            Console.WriteLine();
            ;
            foreach (LivePcapDevice dev in devices)
            {
                Console.WriteLine("{0}) {1} {2}", i, dev.Name, dev.Description);
                i++;
            }

            //选择要监听的网络设备
            Console.WriteLine();
            Console.Write("-- 请选择一个需要监听的网络设备: ");
            i = int.Parse(Console.ReadLine());
            LivePcapDevice device = devices[i];

            Console.Write("-- 请选择操作:监听通讯[C/c],多线程监听通讯[T/t],监听统计[F/f],发送随机数据包[S/s]? ");
            string resp = Console.ReadLine().ToUpper();

            while (!(resp.StartsWith("C") || resp.StartsWith("F") || resp.StartsWith("T") || resp.StartsWith("S")))
            {
                resp = Console.ReadLine().ToUpper();
            }

            try
            {
                if (resp.StartsWith("C") || resp.StartsWith("F") || resp.StartsWith("T"))
                {
                    //监听过滤条件
                    string filter = "ip and tcp";

                    //连接设备
                    System.Threading.Thread backgroundThread = null;
                    ;
                    if (resp.StartsWith("F"))
                    {
                        device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
                        device.SetFilter(filter);
                        device.Mode = CaptureMode.Statistics; //抓包统计
                        device.OnPcapStatistics += new StatisticsModeEventHandler(device_OnPcapStatistics); //抓包统计回调事件
                    }
                    else if (resp.StartsWith("C"))
                    {
                        device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
                        device.SetFilter(filter);
                        device.Mode = CaptureMode.Packets; //抓数据包
                        showDetails = resp.EndsWith("-A"); //当抓数据包时,检查是否要查看详情
                        device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival); //抓数据包回调事件
                    }
                    else
                    {
                        backgroundThread = new System.Threading.Thread(BackgroundThread);
                        backgroundThread.Start();
                        device.Open();
                        device.SetFilter(filter);
                        device.Mode = CaptureMode.Packets; //抓数据包
                        showDetails = resp.EndsWith("-A"); //当抓数据包时,检查是否要查看详情
                        device.OnPacketArrival += new PacketArrivalEventHandler(device_OnThreadPacketArrival); //抓数据包回调事件
                    }

                    Console.WriteLine();
                    Console.WriteLine("-- 当前TCPdump过滤条件: \"{0}\"", filter);
                    Console.WriteLine("-- 正在监听设备 {0}, 按 '回车' 键以停止监听...", device.Description);

                    //开始监听
                    device.StartCapture();

                    //停止监听
                    Console.ReadLine();
                    device.StopCapture();
                    Console.WriteLine("-- 停止监听.");

                    if (backgroundThread != null)
                    {
                        BackgroundThreadStop = true;
                        backgroundThread.Join();
                    }
                }
                else if (resp.StartsWith("S"))
                {
                    //连接设备
                    device.Open();

                    //生成随机数据包
                    byte[] bytes = GetRandomPacket();

                    try
                    {
                        //发送数据

                        device.SendPacket(bytes);
                        SendQueue squeue = );
                        Console.WriteLine("-- 单个数据包发送成功.");

                        ; j < ; j++)
                        {
                            if (!squeue.Add(bytes))
                            {
                                Console.WriteLine("-- 警告: 队列大小不足以存放所有数据包,将只发送部分数据包.");
                                break;
                            }
                        }
                        device.SendQueue(squeue, SendQueueTransmitModes.Synchronized);
                        Console.WriteLine("-- 数据包队列发送完毕.");
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("-- " + e.Message);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("-- " + e.Message);
            }
            finally
            {
                if (device.Opened)
                {
                    //断开设备连接
                    Console.WriteLine(device.Statistics().ToString());
                    device.Close();
                    Console.WriteLine("-- 断开设备连接.");
                    Console.Write("按 '回车' 键以退出...");
                    Console.Read();
                }
            }
        }

SharpPcap网络包捕获框架的使用--实例代码在vs2005调试通过的更多相关文章

  1. C# 利用SharpPcap实现网络包捕获嗅探

    本文是利用SharpPcap实现网络包的捕获的小例子,实现了端口监控,数据包捕获等功能,主要用于学习分享. 什么是SharpPcap? SharpPcap 是一个.NET 环境下的网络包捕获框架,基于 ...

  2. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

  3. Linux 中的网络数据包捕获

    Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...

  4. c#基于事件模型的UDP通讯框架(适用于网络包编解码)

    之前写过一篇关于c#udp分包发送的文章 这篇文章里面介绍的方法是一种实现,可是存在一个缺点就是一个对象序列化后会增大非常多.不利于在网络中的传输. 我们在网络中的传输是须要尽可能的减小传送的数据包的 ...

  5. SpringMVC笔记——SSM框架搭建简单实例

    落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发 ...

  6. linux-pcap 抓包程序框架

    转:http://blog.chinaunix.net/uid-21556133-id-120228.html libpcap详解 2010-12-01 22:07 libpcap(Packet Ca ...

  7. iOS仿写有妖气漫画、视频捕获框架、启动页广告页demo、多种动画效果等源码

    iOS精选源码 以tableview的section为整体添加阴影效果/ta'b'le'vi'e'w顶部悬浮.... 一个可以轻松应用自定义过滤器的视频捕获框架. 基于UITableView的组件,旨 ...

  8. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  9. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

随机推荐

  1. SharePoint 2007 Full Text Searching PowerShell and CS file content with SharePoint Search

    1. Ensure your site or shared folder in one Content Source. 2. Add file types. 3. The second step in ...

  2. Android http Request / Response ContentType

    客户端在进行http请求服务器的时候,需要告诉服务器请求的类型,服务器在返回给客户端的数据的时候,也需要告诉客户端返回数据的类型. 这个类型就是  ContentType  ,不同的ContentTy ...

  3. iOS切图文件的命名规范

    万能公式:

  4. iOS开发new与alloc/init的区别

    [className new]基本等同于[[className alloc] init]: 区别只在于alloc分配内存的时候使用了zone. 这个zone是个什么东东呢? 它是给对象分配内存的时候, ...

  5. python之socket-ssh实例

    本文转载自大王http://www.cnblogs.com/alex3714/articles/5830365.html 加有自己的注释,应该会比原文更突出重点些 一. 基本Socket实例 前面讲了 ...

  6. Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作

    Oracle中对数据对象和数据的管理,无疑都是使用PL/SQL Developer来进行管理,该工具也提供给我们很多方便.快捷的操作,使得我们不再为Oracle本身丑陋.难用的UI而抱怨.由于我们一般 ...

  7. params可变参数

    class Program { // params可变参数 //将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理. //params可变参数必须是形参列表中的最后一个元素. static ...

  8. mysqldump: Got error: 1142: SELECT, LOCK TABLES command denied to user 'root'@'localhost' for table 'accounts' when using LOCK TABLES

    AutoMySQLBackup备份时,出现mysqldump: Got error: 1142: SELECT, LOCK TABLES command denied to user 'root'@' ...

  9. SQL Server 2008 R2——根据数据查找表名和字段名 根据脏数据定位表和字段

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  10. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...