2016-05-04 2 views
1

Pcap.netを使用してネットワークキャプチャ(pcapフォーマット)を操作しようとしています。 私はPCAPファイルを開くとしてダンパーを作成しています:PcapDotNetとDatalinkタイプ

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データリンクはイーサネットタイプであるとしてokです。しかし、私はイーサネット層(rawip)なしでいくつかのキャプチャを持っていると私は新しいイーサネット層を構築する必要があります。

:私はIEnumerableを内のすべての操作パケットを格納し、それらをダンプする場合はキャップのこの種のデータリンクタイプはpcapInFile(生のIP)と同じであると私はイーサネットにそれを変更したい...

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

それが正常に動作します...しかし、これはないあなたは、いくつかのマガキのファイルを扱っている場合に非常に便利です...

任意のアイデア? ありがとう!

答えて

0

まあ、これは答えたが、回避策ではなく、誰もがよりよい解決策を書いていないので、これはそれを固定する方法であるにもかかわらず:

代わりPcapDotNetの

使用SharPcap、その後、あなたがリーダーとこのライターを宣言することができます方法:packetDispatcher機能で

public CaptureFileReaderDevice PcapReader; 
public CaptureFileWriterDevice PcapWriter; 

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

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

そしてRebuildNullLinkLayer機能で使用すると、イーサネットレイヤを追加することができ、ワットを変更あなたが何をしたいのかなど...

RawCaptureコンストラクタを呼び出すとき、RawIpキャプチャを解析している場合、Link Layer(Pcap.Net ...のオリジナル問題)を選択することができますパケットをイーサネットに変換します。

0

すべてのパケットをRAMに格納することを前提とすると、yieldを使用してすべてのパケットをRAMに格納しないIEnumerableを作成できます。

このように、Dumperはパケットをダンプするので、yieldメソッドを使用して次のアイテムに値を設定します。

関連する問題