// test that we can seek a tcpStream beyond the length of the stream
        // then back into the range of the stream and then read
        // a known value
        public void TestTcpStreamSeeking()
        {
            captureFilename = capturePre + captureFN;

            // open the offline file
            var dev = new CaptureFileReaderDevice(captureFilename);

            dev.Open();
            Assert.True(dev != null, "failed to open " + captureFilename);

            TcpStream tcpStream = new TcpStream();

            int             i = 1; // to match the packet numbering in wireshark
            PacketCapture   e;
            GetPacketStatus status;

            while ((status = dev.GetNextPacket(out e)) == GetPacketStatus.PacketRead)
            {
                var rawCapture = e.GetPacket();
                var p          = Packet.ParsePacket(rawCapture.LinkLayerType, rawCapture.Data);
                var tcpPacket  = p.Extract <TcpPacket>();

                // we only want the 4th packet since that is the first packet with a payload
                if (i == 4)
                {
                    tcpStream.AppendPacket(tcpPacket);
                }

                i++;
            }

            dev.Close();

            // what is the length of the stream?
            long length = tcpStream.Length;

            Console.WriteLine("length is {0}", length);

            // seek to the end of the stream
            tcpStream.Seek(0, System.IO.SeekOrigin.End);

            // retrieve the position
            long position = tcpStream.Position;

            Console.WriteLine("position is {0}", position);

            // seek to the start of the stream
            tcpStream.Seek(0, System.IO.SeekOrigin.Begin);

            // retrieve the position
            long position2 = tcpStream.Position;

            Console.WriteLine("position2 is {0}", position2);
        }
        public void TestTcpStream()
        {
            Console.WriteLine(Environment.CurrentDirectory);
            captureFilename = capturePre + captureFN;

            // open the offline file
            var dev = new CaptureFileReaderDevice(captureFilename);

            dev.Open();
            Assert.True(dev != null, "failed to open " + captureFilename);

            TcpStream tcpStream = new TcpStream();

            int             i = 1; // to match the packet numbering in wireshark
            GetPacketStatus status;
            PacketCapture   e;

            while ((status = dev.GetNextPacket(out e)) == GetPacketStatus.PacketRead)
            {
                var rawCapture = e.GetPacket();
                var p          = Packet.ParsePacket(rawCapture.LinkLayerType, rawCapture.Data);
                var tcpPacket  = p.Extract <TcpPacket>();

                Console.WriteLine("{0}", tcpPacket.ToString());
        #if false
                Console.WriteLine("packet_header.len is {0}", p.Length);
                Console.WriteLine("{0}", p.ToString());

                int x;
                for (x = 0; x < packet_header.len; x++)
                {
                    if ((x % 16) == 0)
                    {
                        printf("\n");
                    }
                    printf("%02x ", pPacket[x]);
                }
                printf("\n");
        #endif

                Console.WriteLine("********************");
                Console.WriteLine("i == {0}", i);

                // and hand it off to the tcp_stream
                tcpStream.AppendPacket(tcpPacket);

                Console.WriteLine("Position {0}", tcpStream.Position);
                Console.WriteLine("Length   {0}", tcpStream.Length);

                // make sure the length and position is correct
                // and Seek() to the end of the stream
                if (i == 4)
                {
                    // we expect our length to be 38
                    long expectedLength = 38;
                    Assert.Equal(expectedLength, tcpStream.Length);

                    // advance through these bytes
                    tcpStream.Seek(0, System.IO.SeekOrigin.End);

                    // make sure that our position is correct
                    Assert.Equal(expectedLength, tcpStream.Position);
                }

                if (i == 5)
                {
                    // read the first 26 bytes into a memory stream
                    // these are header bytes, we don't really want them
                    int    bytesToRead = 26;
                    byte[] dataBuffer1 = new byte[bytesToRead];
                    tcpStream.Read(dataBuffer1, 0, dataBuffer1.Length);

                    /////////////////////////////////////
                    // Step two, reading at the current location

                    // save the position
                    long position = tcpStream.Position;

                    // read bytes at that location
                    bytesToRead = 14;
                    byte[] dataBuffer2 = new byte[bytesToRead];
                    tcpStream.Read(dataBuffer2, 0, dataBuffer2.Length);

                    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
                    string actualString           = enc.GetString(dataBuffer2, 0, dataBuffer2.Length);
                    Console.WriteLine("actualString '{0}'", actualString);

                    // expected string
                    string expectedString = "diffie-hellman";

                    // do our strings match?
                    Assert.Equal(expectedString, actualString);

                    // make sure our position advanced by the number of bytes we read
                    Assert.Equal((position + bytesToRead), tcpStream.Position);
                }

                Console.WriteLine("i = {0}", i);
                i++;
            }
            Console.WriteLine();

            dev.Close();
        }