实例介绍
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using PacketDotNet; using SharpPcap; using SharpPcap.AirPcap; using SharpPcap.LibPcap; using SharpPcap.WinPcap; namespace GetNetPackage { public partial class Form1 : Form { private delegate void _CrossSetDataTable(Int64 iSqe, DateTime dtTime, string sSource, ushort sSourcePort, string sDestination, ushort sDesPort, string sProtocol); bool isRun = false; ClsPackageCache clsPkgCache = new ClsPackageCache(); object objLock = new object(); Int64 iPackageCount; DataTable dtPackage = new DataTable(); struct StrPackage { public DateTime Time; //public string Source; //public string Destination; public ushort SourcePort; public ushort DesPort; public int Length; public Packet Packet; //public MyEthernetPacket ePacket; public MyIpPacket ipPacket; public MyTCPPacket tcpPacket; public MyUDPPacket udpPacket; public string Protocols; } Dictionary<Int64, StrPackage> lstPackage = new Dictionary<Int64, StrPackage>(); public Form1() { InitializeComponent(); dtPackage.Columns.Add("Sqe", typeof(Int64) ); dtPackage.Columns.Add("Time", typeof(DateTime)); dtPackage.Columns.Add("Source"); dtPackage.Columns.Add("SourcePort"); dtPackage.Columns.Add("Destination"); dtPackage.Columns.Add("DesPort"); dtPackage.Columns.Add("Protocol"); bdsPackage.DataSource = dtPackage; } private void CrossSetDataTable(Int64 iSqe, DateTime dtTime, string sSource, ushort sSourcePort, string sDestination, ushort sDesPort, string sProtocol) { _CrossSetDataTable SetText = delegate(Int64 Sqe, DateTime Time, string Source, ushort SourcePort, string Destination, ushort DesPort, string Protocol) { this.dtPackage.Rows.Add(new object[] { Sqe, Time, Source, SourcePort, Destination, DesPort, Protocol }); }; this.Invoke(SetText, new object[] { iSqe, dtTime, sSource, sSourcePort, sDestination, sDesPort, sProtocol }); } private void Ini() { iPackageCount = 0; lstPackage.Clear(); dtPackage.Rows.Clear(); txtPackageData.Text = string.Empty; hexEditor1.LoadFromFile(new byte[0]); dgvPackage.Sort(Column1, ListSortDirection.Descending); } private void EnableControl(bool state) { tscbxDeviceLst.Enabled = !isRun; tsbtnOpen.Enabled = !isRun; tstxtFilter.Enabled = !isRun; tsbtnClose.Enabled = isRun; } void PackageAna() { RawCapture rawCapture = clsPkgCache.GetAndRemoveFrist(); if (rawCapture == null) return; iPackageCount ; StrPackage strPackage = new StrPackage(); strPackage.Time = rawCapture.Timeval.Date.ToLocalTime(); strPackage.Length = rawCapture.Data.Length; PacketDotNet.Packet tempPacket = PacketDotNet.Packet.ParsePacket(rawCapture.LinkLayerType, rawCapture.Data); strPackage.Packet = tempPacket; //PacketDotNet.EthernetPacket ePacket = (PacketDotNet.EthernetPacket)PacketDotNet.EthernetPacket.ParsePacket(rawCapture.LinkLayerType, rawCapture.Data); //if (ePacket != null) //{ // strPackage.ePacket = new MyEthernetPacket(ePacket); // strPackage.Protocols = ePacket.Type.ToString() "| "; // //CrossSetDataTable(iPackageCount, strPackage.Time, ePacket.SourceHwAddress.ToString(), ePacket.DestinationHwAddress.ToString(), ePacket.Type.ToString()); //} IpPacket ipPack = PacketDotNet.IpPacket.GetEncapsulated(tempPacket); if (ipPack != null) { strPackage.Protocols = ipPack.Protocol.ToString() "| "; strPackage.ipPacket = new MyIpPacket(ipPack); if (ipPack.Protocol.ToString() == "TCP") { PacketDotNet.TcpPacket tcppacket = TcpPacket.GetEncapsulated(tempPacket); if (tcppacket != null) { strPackage.tcpPacket = new MyTCPPacket(tcppacket); strPackage.SourcePort = tcppacket.SourcePort; // 80, 8080, 3128: Http; 21: FTP; 25: SMTP; 110: POP3 strPackage.DesPort = tcppacket.DestinationPort; } } else if (ipPack.Protocol.ToString() == "UDP") { PacketDotNet.UdpPacket udppacket = UdpPacket.GetEncapsulated(tempPacket); if (udppacket != null) { strPackage.udpPacket = new MyUDPPacket(udppacket); strPackage.SourcePort = udppacket.SourcePort; // 53: DNS strPackage.DesPort = udppacket.DestinationPort; } } CrossSetDataTable(iPackageCount, strPackage.Time, ipPack.SourceAddress.ToString(), strPackage.SourcePort, ipPack.DestinationAddress.ToString(), strPackage.DesPort, ipPack.Protocol.ToString()); lstPackage.Add(iPackageCount, strPackage); } } private void Form1_Load(object sender, EventArgs e) { tscbxDeviceLst.ComboBox.DisplayMember = "Text"; tscbxDeviceLst.ComboBox.ValueMember = "Value"; CaptureDeviceList deviceLst = CaptureDeviceList.Instance; foreach (ICaptureDevice dev in deviceLst) { if (dev is AirPcapDevice) { Console.WriteLine(dev.ToString()); } else if (dev is WinPcapDevice) { ClsComboboxItem clsCbxItem = new ClsComboboxItem(); clsCbxItem.Text = ((WinPcapDevice)dev).Interface.FriendlyName " " dev.Description.Split('\'')[1]; clsCbxItem.Value = dev; tscbxDeviceLst.ComboBox.Items.Add(clsCbxItem); } else if (dev is LibPcapLiveDevice) { Console.WriteLine(dev.ToString()); } } } private void tsbtnOpen_Click(object sender, EventArgs e) { if (tscbxDeviceLst.SelectedItem != null) { // 历史记录初始化 Ini(); ICaptureDevice Dev = ((ClsComboboxItem)tscbxDeviceLst.SelectedItem).Value; Dev.OnPacketArrival = new PacketArrivalEventHandler(Dev_OnPacketArrival); Dev.Open(); Dev.Filter = tstxtFilter.Text; Dev.StartCapture(); isRun = true; bgwPackageAna.RunWorkerAsync(); EnableControl(true); } } private void tsbtnClose_Click(object sender, EventArgs e) { ICaptureDevice Device = ((ClsComboboxItem)tscbxDeviceLst.SelectedItem).Value; Device.StopCapture(); Device.Close(); isRun = false; tsbtnClose.Enabled = false; } void Dev_OnPacketArrival(object sender, CaptureEventArgs e) { lock (objLock) { clsPkgCache.AddItem(e.Packet); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (isRun) { tsbtnClose_Click(null, null); } } private void bgwPackageAna_DoWork(object sender, DoWorkEventArgs e) { while(isRun || clsPkgCache.GetCount() >0 ) { PackageAna(); Thread.Sleep(50); } } private void bgwPackageAna_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { EnableControl(false); } private void dgvPackage_CurrentCellChanged(object sender, EventArgs e) { if (dgvPackage.CurrentCell != null) { StrPackage sp; lstPackage.TryGetValue((Int64)dgvPackage[0, dgvPackage.CurrentCell.RowIndex].Value, out sp); if (sp.Packet != null) { hexEditor1.LoadFromFile(sp.Packet.Bytes); txtPackageData.Text = sp.Packet.PrintHex(); } } } private void timer1_Tick(object sender, EventArgs e) { lblPackageCacheCount.Text = clsPkgCache.GetCount().ToString(); } private void toolStripButton1_Click(object sender, EventArgs e) { Ini(); } } }
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论