Exemplo n.º 1
0
 /// <summary>
 /// Should always be invoked by other overload method.
 /// </summary>
 /// <param name="segs"></param>
 /// <param name="tpktLen"></param>
 /// <param name="segLen"></param>
 private void BuildSegments(ByteArraySegment segs, int tpktLen, int segLen)
 {
     if (tpktLen > segLen)
     {
         // The begin of next frame packet tcp payload is a successor of THIS segment.
         NextFrameSegmentLength = tpktLen - segLen;
         LastSegment            = false;
         segs.Length            = segLen;
         TpktSegments.Add(new TpktSegment(segs, true));
     }
     else if (tpktLen == segLen)
     {
         // This packet contains the last segment, it's ready for reasseble
         NextFrameSegmentLength = 0;
         LastSegment            = true; // The last segment of this frame is the last part of an integreted tpkt packet.
         segs.Length            = segLen;
         TpktSegments.Add(new TpktSegment(segs, true));
     }
     else // if (tpktLen < segLen)
     {
         // Contains a integral TPKT and another one or more segment(s) succeed
         segs.Length = tpktLen;
         TpktSegments.Add(new TpktSegment(segs, true));
         BuildSegments(segs.EncapsulatedBytes(), false);
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// For a frame with leading segment.
        /// </summary>
        /// <param name="segs">The segment without the leading segments</param>
        private void BuildSegments(ByteArraySegment segs, bool referFileds)
        {
            HasSegments = true;
            TcpPacketType type;
            int           segLen = segs.Length;

            if (referFileds)
            {
                segs.Length = fileds.LeadingSegmentLength;
                TpktSegments.Add(new TpktSegment(this.header.ActualBytes(), false));   // possible some refactoring here
                segs = segs.EncapsulatedBytes();
                // refresh the length value
                segLen = segs.Length;   // When succssor's payload has only one segment, it will crash. see X.X.0.115 No.7322, 7325
            }
            if (segLen > 0)
            {
                byte[] potentialHeader = segs.ActualBytes().Take(TpktFileds.HeaderLength).ToArray();
                type = (TcpPacketType)(BigEndianBitConverter.Big.ToInt16(potentialHeader, 0));
                switch (type)
                {
                case TcpPacketType.Tpkt:
                    int tpktLen = BigEndianBitConverter.Big.ToInt16(potentialHeader,
                                                                    TpktFileds.ReservedLength + TpktFileds.VersionLength
                                                                    );
                    // refresh the length value
                    //    segs.Length = segLen;
                    BuildSegments(segs, tpktLen, segLen);
                    break;

                default:
                    break;
                }
            }
            else
            {
                LastSegment = true;
            }
        }