/// <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; }
/// <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); } }