SharpPcapネットワークパケットキャプチャフレームワークの使用--インスタンスコードvs 2005でのデバッグに合格

11054 ワード

回転:http://hi.baidu.com/boyxgb/blog/item/89ac86fbdff5f82c4e4aea2e.html
プロジェクトの必要性から,端末とサーバの通信データから端末ハードウェア状態を取得するため,広く知られているC#キャプチャライブラリSharpPcapを用いた.SharpPcapの最新バージョンは.Net 3.5とWinPcapに基づいて3.1.0です.ここで注意してください.もしあなたが使っているバージョンと私のバージョンの違いが大きすぎると、この文章を読む時間を無駄にする必要はありません.たとえば、.Net 2.0ベースの古いバージョンを使用している場合、ライブラリはまったく異なります.SharpPcapを検索してください.古いバージョンのSharpPcapの文章は多いです.あるいは、最新のバージョンを使用している場合は、SharpPcapダウンロードサイトの最新版sourceパッケージのexamplesの内容を直接参照してください.使用前にまずWinPcapをインストールし、アドレスをダウンロードする必要があります.http://www.winpcap.org/install/default.htmSharpPcapダウンロード先: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;
            if (devices.Count < 1)
            {
                Console.WriteLine("       ");
                return;
            }
            Console.WriteLine();
            Console.WriteLine("                 :");
            Console.WriteLine("----------------------------------------------------");
            Console.WriteLine();
            int i = 0;
            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;
                    int readTimeoutMilliseconds = 1000;
                    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 = new SendQueue(2000);
                        Console.WriteLine("--          .");

                        for (int j = 0; j < 10; 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();
                }
            }
        }