/// <inheritdoc/> public IPacket ReadNextPacket() { uint secs, usecs, caplen, len; long position = 0; byte[] data; while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length) { lock (this.syncRoot) { position = binaryReader.BaseStream.Position; secs = binaryReader.ReadUInt32().ReverseByteOrder(Header.ReverseByteOrder); usecs = binaryReader.ReadUInt32().ReverseByteOrder(Header.ReverseByteOrder); if (Header.NanoSecondResolution) { usecs = usecs / 1000; } caplen = binaryReader.ReadUInt32().ReverseByteOrder(Header.ReverseByteOrder); len = binaryReader.ReadUInt32().ReverseByteOrder(Header.ReverseByteOrder); data = binaryReader.ReadBytes((int)caplen); if (data.Length < caplen) { throw new EndOfStreamException("Unable to read beyond the end of the stream"); } } var packet = new PcapPacket(secs, usecs, data, position); return(packet); } return(null); }
/// <summary> /// Read all packet from a stream. After read any packet event OnReadPacketEvent is called. /// Function is NOT asynchronous! (blocking thread). If you want abort it, use CancellationToken /// </summary> /// <param name="cancellationToken"></param> public void ReadPackets(System.Threading.CancellationToken cancellationToken) { uint secs, usecs, caplen, len; long position = 0; byte[] data; while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length && !cancellationToken.IsCancellationRequested) { try { lock (syncRoot) { position = binaryReader.BaseStream.Position; secs = binaryReader.ReadUInt32().ReverseByteOrder(Header.ReverseByteOrder); usecs = binaryReader.ReadUInt32().ReverseByteOrder(Header.ReverseByteOrder); if (Header.NanoSecondResolution) { usecs = usecs / 1000; } caplen = binaryReader.ReadUInt32().ReverseByteOrder(Header.ReverseByteOrder); len = binaryReader.ReadUInt32().ReverseByteOrder(Header.ReverseByteOrder); data = binaryReader.ReadBytes((int)caplen); if (data.Length < caplen) { throw new EndOfStreamException("Unable to read beyond the end of the stream"); } } PcapPacket packet = new PcapPacket((UInt64)secs, (UInt64)usecs, data, position); OnReadPacket(packet); } catch (Exception exc) { OnException(exc); } } }