sharppcap的dll下載地址:
sourceforge.net/directory/os:windows/?q=sharppcap
詳細用法:
www.codeproject.com/KB/IP/sharppcap.aspx
為了進一步說明使用方式,在此分享一個我寫的wrapper類。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Threading;using SharpPcap;using PacketDotNet;using SharpPcap.LibPcap;namespace ServerToolV0._1.Capture{ public class WinCapHelper { private static object syncObj = new object(); private static WinCapHelper _capInstance; public static WinCapHelper WinCapInstance { get { if (null == _capInstance) { lock (syncObj) { if (null == _capInstance) { _capInstance = new WinCapHelper(); } } } return _capInstance; } } private Thread _thread; /// <summary> /// when get pocket,callback /// </summary> public Action<string> _logAction; /// <summary> /// 過濾條件關鍵字 /// </summary> public string filter; private WinCapHelper() { } public void Listen() { if (_thread != null && _thread.IsAlive) { return; } _thread = new Thread(new ThreadStart(() => { ////遍曆網卡 foreach (PcapDevice device in SharpPcap.CaptureDeviceList.Instance) { ////分別啟動監聽,指定包的處理函數 device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival); device.Open(DeviceMode.Normal, 1000); device.Capture(500); //device.StartCapture(); } })); _thread.Start(); } /// <summary> /// 列印包資訊,組合包太複雜了,所以直接把hex字串打出來了 /// </summary> /// <param name="str"></param> /// <param name="p"></param> private void PrintPacket(ref string str, Packet p) { if (p != null) { string s = p.ToString(); if (!string.IsNullOrEmpty(filter) && !s.Contains(filter)) { return; } str += "\r\n" + s + "\r\n"; ////嘗試建立新的TCP/IP資料包對象, ////第一個參數為以太頭長度,第二個為資料包資料區塊 str += p.PrintHex() + "\r\n"; } } /// <summary> /// 接收到包的處理函數 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void device_OnPacketArrival(object sender, CaptureEventArgs e) { ////解析出基本包 var packet = PacketDotNet.Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); ////協議類別 // var dlPacket = PacketDotNet.DataLinkPacket.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); //var ethernetPacket = PacketDotNet.EthernetPacket.GetEncapsulated(packet); //var internetLinkPacket = PacketDotNet.InternetLinkLayerPacket.Parse(packet.BytesHighPerformance.Bytes); //var internetPacket = PacketDotNet.InternetPacket.Parse(packet.BytesHighPerformance.Bytes); //var sessionPacket = PacketDotNet.SessionPacket.Parse(packet.BytesHighPerformance.Bytes); //var appPacket = PacketDotNet.ApplicationPacket.Parse(packet.BytesHighPerformance.Bytes); //var pppoePacket = PacketDotNet.PPPoEPacket.Parse(packet.BytesHighPerformance.Bytes); //var arpPacket = PacketDotNet.ARPPacket.GetEncapsulated(packet); //var ipPacket = PacketDotNet.IpPacket.GetEncapsulated(packet); //ip包 //var udpPacket = PacketDotNet.UdpPacket.GetEncapsulated(packet); //var tcpPacket = PacketDotNet.TcpPacket.GetEncapsulated(packet); string ret = ""; PrintPacket(ref ret, packet); //ParsePacket(ref ret, ethernetPacket); //ParsePacket(ref ret, internetLinkPacket); //ParsePacket(ref ret, internetPacket); //ParsePacket(ref ret, sessionPacket); //ParsePacket(ref ret, appPacket); //ParsePacket(ref ret, pppoePacket); //ParsePacket(ref ret, arpPacket); //ParsePacket(ref ret, ipPacket); //ParsePacket(ref ret, udpPacket); //ParsePacket(ref ret, tcpPacket); if (!string.IsNullOrEmpty(ret)) { string rlt = "\r\n時間 : " + DateTime.Now.ToLongTimeString() + "\r\n資料包: \r\n" + ret; _logAction(rlt); } } public void StopAll() { foreach (PcapDevice device in SharpPcap.CaptureDeviceList.Instance) { if (device.Opened) { Thread.Sleep(500); device.StopCapture(); } _logAction("device : " + device.Description + " stoped.\r\n"); } _thread.Abort(); } }}
以上就是c# 使用sharppcap實現 網路抓包的詳情的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!