示例#1
0
文件: Segment.cs 项目: nakdai/izanagi
        /// <summary>
        /// データをパースして、対応するセグメントを作成する.
        /// </summary>
        /// <param name="bytes"></param>
        /// <param name="offset"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        public static Segment Parse(byte[] bytes, int offset, int length)
        {
            Segment ret = null;

            var flags = bytes[0];

            if (CheckFlag(flags, Type.SYN))
            {
                ret = new SynchronousSegment();
            }
            else if (CheckFlag(flags, Type.NUL))
            {
                ret = new NullSegment();
            }
            else if (CheckFlag(flags, Type.EAK))
            {
                ret = new ExtendAckSegment();
            }
            else if (CheckFlag(flags, Type.RST))
            {
                ret = new ResetSegment();
            }
            else if (CheckFlag(flags, Type.FIN))
            {
                ret = new FinishSegment();
            }
            else if (CheckFlag(flags, Type.ACK))
            {
                //var headerSize = bytes[1];

                if (length == RUDP_HEADER_LEN)
                {
                    // ACK
                    ret = new AcknowledgementSegment();
                }
                else
                {
                    // DAT
                    ret = new DataSegment();
                }
            }

            if (ret != null)
            {
                ret.ReadBytes(bytes, offset, length);
            }
            else {
                throw new ApplicationException();
            }

            return ret;
        }
示例#2
0
        /// <summary>
        /// 受信した返事を返す.
        /// </summary>
        /// <param name="segment">返事をする対象のセグメント</param>
        private void SendSingleAcknowledgement(Segment segment)
        {
            // 受信したけど返信していないセグメントの数が 0 のときは何もしない.
            if (this.UnAckedRecievedSegmentList.Count == 0)
            {
                return;
            }

            #if false
            var lastInSequence = this.Counter.GetLastInSequenceNumber();

            var sendSegment = new AcknowledgementSegment(
                NextSequenceNumber(lastInSequence),
                lastInSequence);
            #else
            var sendSegment = new AcknowledgementSegment(
                NextSequenceNumber(segment.SequenceNumber),
                segment.SequenceNumber);
            #endif

            // 送信.
            SendSegment(sendSegment);

            if (segment != null)
            {
                // NOTE
                // 順番が入れ替わった場合もあるのでここでシーケンス番号チェックはできない

                // 受信したが確認応答を送っていないセグメントのリストから削除.
                this.UnAckedRecievedSegmentList.Remove(segment);
            }
        }