c# 使用sharppcap实现 网络抓包的详情

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;        ///         /// when get pocket,callback        ///         public Action _logAction;        ///         /// 过滤条件关键字        ///         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();        }        ///         /// 打印包信息,组合包太复杂了,所以直接把hex字符串打出来了        ///         ///         ///         private void PrintPacket(ref string str, Packet p)        {            if (p != null)            {                string s = p.ToString();                if (!string.IsNullOrEmpty(filter) && !s.Contains(filter))                {                    return;                }                str += "" + s + "";                ////尝试创建新的TCP/IP数据包对象,                ////第一个参数为以太头长度,第二个为数据包数据块                str += p.PrintHex() + "";            }        }        ///         /// 接收到包的处理函数        ///         ///         ///         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 = "时间 : " +                    DateTime.Now.ToLongTimeString() +                    "数据包: " + 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.");            }            _thread.Abort();        }    }}

登录后复制

 以上就是c# 使用sharppcap实现 网络抓包的详情的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2495648.html

(0)
上一篇 2025年3月5日 02:22:18
下一篇 2025年2月21日 12:53:29

AD推荐 黄金广告位招租... 更多推荐

发表回复

登录后才能评论