C# GUI项目中基于Pcap.net读取Pcap文件并按IP过滤的实现问题
C# WinForm基于Pcap.net解析pcap文件解决方案
问题根因
你当前读取pcap文件出现乱码,是因为pcap属于二进制格式的抓包文件,不能用File.ReadAllText()这种纯文本读取接口处理,必须通过Pcap.net提供的离线文件解析接口提取结构化信息后再输出。
前置准备
确认项目中已正确引用以下Pcap.net核心依赖:
- PcapDotNet.Base.dll
- PcapDotNet.Core.dll
- PcapDotNet.Packets.dll
实现代码
首先在代码文件头部添加命名空间引用:
using PcapDotNet.Core; using PcapDotNet.Packets; using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.IpV4; using System.IO;
替换原有button1_Click逻辑,同时兼容纯文本和pcap文件读取:
private void button1_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() != DialogResult.OK) return; string filename = openFileDialog1.FileName; string fileExt = Path.GetExtension(filename).ToLower(); // 纯文本文件走原有逻辑 if (fileExt is ".txt" or ".log") { richTextBox1.Text = File.ReadAllText(filename); return; } // pcap文件走解析逻辑 if (fileExt is ".pcap" or ".pcapng") { richTextBox1.Clear(); try { // 打开离线pcap文件 OfflinePacketDevice pcapFile = new OfflinePacketDevice(filename); using (PacketCommunicator communicator = pcapFile.Open(65536, PacketDeviceOpenAttributes.Promiscuous, 1000)) { // *可选 开启IP过滤:取消下方注释,修改过滤规则即可,支持标准BPF语法 // communicator.SetFilter("ip src 192.168.1.2 or ip dst 192.168.1.2"); Packet packet; int packetNum = 1; // 遍历所有数据包 while (communicator.ReceivePacket(out packet) == PacketCommunicatorReceiveResult.Ok) { IpV4Layer ipLayer = packet.Ethernet.IpV4; // 跳过非IPv4包,如需支持IPv6可自行扩展对应逻辑 if (ipLayer == null) continue; // 格式化输出包信息到richTextBox richTextBox1.AppendText($"=== 第 {packetNum} 个数据包 ===\n"); richTextBox1.AppendText($"捕获时间:{packet.Timestamp:yyyy-MM-dd HH:mm:ss.fff}\n"); richTextBox1.AppendText($"源MAC:{packet.Ethernet.Source}\n"); richTextBox1.AppendText($"目的MAC:{packet.Ethernet.Destination}\n"); richTextBox1.AppendText($"源IP:{ipLayer.Source}\n"); richTextBox1.AppendText($"目的IP:{ipLayer.Destination}\n"); richTextBox1.AppendText($"传输协议:{ipLayer.Protocol}\n"); richTextBox1.AppendText($"数据包长度:{packet.Length} 字节\n\n"); packetNum++; } } } catch (Exception ex) { richTextBox1.Text = $"pcap解析失败:{ex.Message}"; } } }
功能扩展说明
- IP/端口/协议过滤直接修改
SetFilter的参数即可,支持标准Berkeley包过滤语法,无需转CSV格式,避免跨设备兼容问题 - 如需提取TCP/UDP的 payload 内容,可通过
ipLayer.Tcp.Payload或者ipLayer.Udp.Payload属性进一步解析 - 发布程序时将Pcap.net相关依赖dll和主程序一起打包,即可在其他设备正常运行
内容的提问来源于stack exchange,提问作者Newborn
相关产品推荐
相关产品推荐

