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を除く):
プロジェクトの必要性から,端末とサーバの通信データから端末ハードウェア状態を取得するため,広く知られている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();
}
}
}