1

我正在尝试使用 Pcap.net 操作一些网络捕获(pcap 格式)。我正在打开 pcap 文件并使用以下命令创建转储程序:

OfflinePacketDevice selectedDevice = new OfflinePacketDevice(pcapInFile);
using (PacketCommunicator PcapReader = selectedDevice.Open(655360, PacketDeviceOpenAttributes.Promiscuous, 1000))
{
    PacketDumpFile PcapWriter = PcapReader.OpenDump(pcapOutFile);
    PcapReader.ReceivePackets(count, PacketDispatcher);
}

PacketDispatcher 类似于:

private void PacketDispatcher(Packet packet)
{
    // Manipulate the packet
    PcapWriter.Dump(packet);
}

就 pcapInFile 数据链路是以太网类型而言,一切都很好。但是我有几个没有以太网层(rawip)的捕获,我必须建立一个新的以太网层。在这种上限中,数据链路类型与 pcapInFile(原始 ip)相同,我想将其更改为以太网 ...

如果我将所有操纵的数据包存储在一个 ienumerable 中并将它们转储为:

PacketDumpFile.Dump(pcapOutFile, new PcapDataLink(1), Packets.Count(), Packets);

它工作得很好......但是,如果你正在处理几个千兆的文件,这不是很有用......

任何的想法?谢谢!

4

2 回答 2

0

假设关注的是所有数据包都在 RAM 中,您可以使用yield创建一个不包含 RAM 中所有内容的 IEnumerable 。

这样,当 Dumper 转储数据包时,它将调用您的方法来使用 yield 填充下一个项目。

于 2016-05-14T13:04:02.567 回答
0

好吧,尽管这不是答案,而是一种解决方法,而且由于没有人写出更好的解决方案,这就是如何修复它:

使用 SharPcap 而不是 PcapDotNet,那么你可以这样声明一个 reader 和 writer:

public CaptureFileReaderDevice PcapReader;
public CaptureFileWriterDevice PcapWriter;

PcapReader = new CaptureFileReaderDevice(fileIn);
PcapReader.OnPacketArrival += packetDispatcher;
PcapReader.Capture();

在 packetDispatcher 函数中:

RawCapture raw = new RawCapture(LinkLayers.Ethernet, e.Packet.Timeval,RebuildNullLinkLayer(e, offset));
CaptureHandler.PcapWriter.Write(raw);

在 RebuildNullLinkLayer 函数中,您可以添加以太网层,修改您想要的任何内容,等等......

请注意,当您调用 RawCapture 构造函数时,您可以选择链路层(mi original issue with Pcap.Net ...),因此如果您正在解析 RawIp 捕获,您可以将数据包转换为以太网。

于 2017-07-23T09:11:09.830 回答