예제 #1
0
        public static SaiFrame Parse(byte[] bytes)
        {
            SaiFrame theFrame = null;

            var theFrameType = (SaiFrameType)bytes[0];

            if (theFrameType == SaiFrameType.TTS_OffsetStart)
            {
                theFrame = new SaiTtsFrameOffsetStart();
            }
            else if (theFrameType == SaiFrameType.TTS_OffsetAnswer1)
            {
                theFrame = new SaiTtsFrameOffsetAnswer1();
            }
            else if (theFrameType == SaiFrameType.TTS_OffsetAnswer2)
            {
                theFrame = new SaiTtsFrameOffsetAnswer2();
            }
            else if (theFrameType == SaiFrameType.TTS_OffsetEstimate)
            {
                theFrame = new SaiTtsFrameEstimate();
            }
            else if (theFrameType == SaiFrameType.TTS_OffsetEnd)
            {
                theFrame = new SaiTtsFrameOffsetEnd();
            }
            else if (theFrameType == SaiFrameType.TTS_AppData)
            {
                theFrame = new SaiTtsFrameAppData();
            }
            else if (theFrameType == SaiFrameType.EC_Start)
            {
                theFrame = new SaiEcFrameStart();
            }
            else if (theFrameType == SaiFrameType.EC_AppData)
            {
                theFrame = new SaiEcFrameApplication();
            }
            else if (theFrameType == SaiFrameType.EC_AppDataAskForAck)
            {
                theFrame = new SaiEcFrameAskForAck();
            }
            else if (theFrameType == SaiFrameType.EC_AppDataAcknowlegment)
            {
                theFrame = new SaiEcFrameAcknowlegment();
            }
            else
            {
                throw new InvalidOperationException(string.Format("无法解析指定的Sai帧,不可识别的类型{0}。", theFrameType));
            }

            theFrame.ParseBytes(bytes);

            return(theFrame);
        }
예제 #2
0
        public void Test1()
        {
            var frame1 = new SaiEcFrameAskForAck();

            frame1.SequenceNo = 200;
            frame1.EcValue    = 100;
            frame1.UserData   = new byte[] { 1 };

            var bytes = frame1.GetBytes();

            var frame2 = SaiFrame.Parse(bytes) as SaiEcFrameAskForAck;

            Assert.AreEqual(SaiFrameType.EC_AppDataAskForAck, frame2.FrameType);
            Assert.AreEqual(frame2.SequenceNo, frame1.SequenceNo);
            Assert.AreEqual(frame2.EcValue, frame1.EcValue);
            Assert.AreEqual(frame2.UserData[0], frame1.UserData[0]);
        }
예제 #3
0
        protected override void HandleEcAskForAckFrame(SaiEcFrameAskForAck askForAckFrame)
        {
            // 提取用户数据并通知观察器。
            if (askForAckFrame.UserData != null)
            {
                var timeDelay = this.DefenseStrategy.CalcTimeDelay(askForAckFrame);
                var remoteID  = this.Context.RsspEP.RemoteID;

                this.Context.Observer.OnSaiUserDataArrival(remoteID, askForAckFrame.UserData, timeDelay, MessageDelayDefenseTech.EC);
            }

            // 回复Acknowlegment。
            var ecValue = this.DefenseStrategy.GetLocalEcValue();
            var seqNo   = (ushort)this.Context.SeqNoManager.GetAndUpdateSendSeq();
            var frame   = new SaiEcFrameAcknowlegment(seqNo, ecValue, null);

            var bytes = frame.GetBytes();

            this.Context.NextLayer.SendUserData(bytes);
        }
예제 #4
0
파일: EcState.cs 프로젝트: ldw880212/RsspII
 protected virtual void HandleEcAskForAckFrame(SaiEcFrameAskForAck frame)
 {
     LogUtility.Error(string.Format("{0}: {1}.{2} not implement!",
                                    this.Context.RsspEP.ID, this.GetType().Name,
                                    new StackFrame(0).GetMethod().Name.Split('.').Last()));
 }