Как использовать SharpPcap для быстрого сброса пакетов

Я использую SharpPcap для сброса пакетов в файл .pcap. Моя проблема в том, что он работает медленно, чтобы захватить любой объем сетевого трафика, и в конце концов у меня заканчивается память. Как ускорить процесс записи файла?

Вот код, который я использую:

    private void WriteToPCAPThread(object o)
    {
        this.WritePcapThreadDone.Reset();
        string captureFileName = (string)o;
        CaptureFileWriterDevice captureFileWriter = new CaptureFileWriterDevice(this.device, captureFileName);
        captureFileWriter.Open();
        RawCapture packet;
        bool success;
        while (this.capturing)
        {
            success = this.captures.TryDequeue(out packet);
            if (success)
            {
                captureFileWriter.Write(packet);
            }
            else
            {
                // Queue emptied
                Thread.Sleep(50);
            }
        }
    }

Заранее спасибо за любые идеи.


person Christian    schedule 12.11.2015    source источник


Ответы (1)


В итоге я написал свой собственный StreamWriter. Теперь я получаю 100% производительность от моего SSD.

public PcapStream
{
    private Stream BaseStream;
    public PcapStream(Stream BaseStream)
    {
        this.BaseStream=BaseStream;
    }
    public void Write(RawCapture packet)
    {
        byte[] arr = new byte[packet.Data.Length + 16];
        byte[] sec = BitConverter.GetBytes((uint)packet.Timeval.Seconds);
        byte[] msec = BitConverter.GetBytes((uint)packet.Timeval.MicroSeconds);
        byte[] incllen = BitConverter.GetBytes((uint)packet.Data.Length);
        byte[] origlen = BitConverter.GetBytes((uint)packet.Data.Length);
        Array.Copy(sec, arr, sec.Length);
        int offset = sec.Length;
        Array.Copy(msec, 0, arr, offset, msec.Length);
        offset += msec.Length;
        Array.Copy(incllen, 0, arr, offset, incllen.Length);
        offset += incllen.Length;
        Array.Copy(origlen, 0, arr, offset, origlen.Length);
        offset += origlen.Length;
        Array.Copy(packet.Data, 0, arr, offset, packet.Data.Length);
        BaseStream.Write(arr, 0, arr.Length);
    }
person Christian    schedule 24.11.2015