我正在尝试使用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)相同,我想将其更改为以太网...
如果我将所有被操纵的数据包存储在一个可相关的数据库中并将其转储为:
PacketDumpFile.Dump(pcapOutFile, new PcapDataLink(1), Packets.Count(), Packets);
它工作得很好......但是,如果你正在处理几个千兆的文件,这不是很有用......
有什么想法吗? 谢谢!
答案 0 :(得分:0)
假设关注的是将所有数据包放入RAM中,您可以使用yield创建一个不包含RAM中所有内容的IEnumerable。
这样,当Dumper转储数据包时,它会调用您的方法使用yield填充下一个项目。
答案 1 :(得分:0)
嗯,尽管这不是一个答案,而是一个解决方法,因为没有人写出更好的解决方案,这就是修复它的方法:
使用SharPcap代替PcapDotNet,然后你就可以这样声明一个读者和一个作家:
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构造函数时,您可以选择链接层(使用Pcap.Net的mi原始问题...),因此,如果要解析RawIp捕获,则可以将数据包转换为以太网。