You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:12:00