コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
                }
            }
        }