177 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
using DotNetty.Buffers;
 | 
						||
using DotNetty.Common;
 | 
						||
 | 
						||
namespace base_kcp
 | 
						||
{
 | 
						||
    public class Segment
 | 
						||
    {
 | 
						||
        private readonly ThreadLocalPool.Handle recyclerHandle;
 | 
						||
 | 
						||
        /**会话id**/
 | 
						||
 | 
						||
        /**命令**/
 | 
						||
        private byte cmd;
 | 
						||
 | 
						||
        /**message中的segment分片ID(在message中的索引,由大到小,0表示最后一个分片)**/
 | 
						||
        private short frg;
 | 
						||
 | 
						||
        /**剩余接收窗口大小(接收窗口大小-接收队列大小)**/
 | 
						||
        private int wnd;
 | 
						||
 | 
						||
        /**message发送时刻的时间戳**/
 | 
						||
        private long ts;
 | 
						||
 | 
						||
        /**message分片segment的序号**/
 | 
						||
        private long sn;
 | 
						||
 | 
						||
        /**待接收消息序号(接收滑动窗口左端)**/
 | 
						||
        private long una;
 | 
						||
 | 
						||
        /**下次超时重传的时间戳**/
 | 
						||
        private long resendts;
 | 
						||
 | 
						||
        /**该分片的超时重传等待时间**/
 | 
						||
        private int rto;
 | 
						||
 | 
						||
        /**收到ack时计算的该分片被跳过的累计次数,即该分片后的包都被对方收到了,达到一定次数,重传当前分片**/
 | 
						||
        private int fastack;
 | 
						||
 | 
						||
        /***发送分片的次数,每发送一次加一**/
 | 
						||
        private int xmit;
 | 
						||
 | 
						||
        private long ackMask;
 | 
						||
 | 
						||
        private IByteBuffer data;
 | 
						||
 | 
						||
        private int ackMaskSize;
 | 
						||
 | 
						||
        private static readonly ThreadLocalPool<Segment> RECYCLER =
 | 
						||
            new ThreadLocalPool<Segment>(handle =>
 | 
						||
            {
 | 
						||
                return new Segment(handle);
 | 
						||
            });
 | 
						||
 | 
						||
        private Segment(ThreadLocalPool.Handle recyclerHandle)
 | 
						||
        {
 | 
						||
            this.recyclerHandle =recyclerHandle;
 | 
						||
        }
 | 
						||
 | 
						||
        public void recycle(bool releaseBuf) {
 | 
						||
            Conv = 0;
 | 
						||
            cmd = 0;
 | 
						||
            frg = 0;
 | 
						||
            wnd = 0;
 | 
						||
            ts = 0;
 | 
						||
            sn = 0;
 | 
						||
            una = 0;
 | 
						||
            resendts = 0;
 | 
						||
            rto = 0;
 | 
						||
            fastack = 0;
 | 
						||
            xmit = 0;
 | 
						||
            ackMask=0;
 | 
						||
            if (releaseBuf) {
 | 
						||
                data.Release();
 | 
						||
            }
 | 
						||
            data = null;
 | 
						||
            recyclerHandle.Release(this);
 | 
						||
        }
 | 
						||
 | 
						||
        public static Segment createSegment(IByteBufferAllocator byteBufAllocator, int size) {
 | 
						||
            Segment seg = RECYCLER.Take();
 | 
						||
            if (size == 0) {
 | 
						||
                seg.data = byteBufAllocator.DirectBuffer(0, 0);
 | 
						||
            } else {
 | 
						||
                seg.data = byteBufAllocator.DirectBuffer(size);
 | 
						||
            }
 | 
						||
            return seg;
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        public static Segment createSegment(IByteBuffer buf) {
 | 
						||
            Segment seg = RECYCLER.Take();
 | 
						||
            seg.data = buf;
 | 
						||
            return seg;
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        public int Conv { get; set; }
 | 
						||
 | 
						||
        public byte Cmd
 | 
						||
        {
 | 
						||
            get => cmd;
 | 
						||
            set => cmd = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public short Frg
 | 
						||
        {
 | 
						||
            get => frg;
 | 
						||
            set => frg = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public int Wnd
 | 
						||
        {
 | 
						||
            get => wnd;
 | 
						||
            set => wnd = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public long Ts
 | 
						||
        {
 | 
						||
            get => ts;
 | 
						||
            set => ts = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public long Sn
 | 
						||
        {
 | 
						||
            get => sn;
 | 
						||
            set => sn = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public long Una
 | 
						||
        {
 | 
						||
            get => una;
 | 
						||
            set => una = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public long Resendts
 | 
						||
        {
 | 
						||
            get => resendts;
 | 
						||
            set => resendts = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public int Rto
 | 
						||
        {
 | 
						||
            get => rto;
 | 
						||
            set => rto = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public int Fastack
 | 
						||
        {
 | 
						||
            get => fastack;
 | 
						||
            set => fastack = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public int Xmit
 | 
						||
        {
 | 
						||
            get => xmit;
 | 
						||
            set => xmit = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public long AckMask
 | 
						||
        {
 | 
						||
            get => ackMask;
 | 
						||
            set => ackMask = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public IByteBuffer Data
 | 
						||
        {
 | 
						||
            get => data;
 | 
						||
            set => data = value;
 | 
						||
        }
 | 
						||
 | 
						||
        public int AckMaskSize
 | 
						||
        {
 | 
						||
            get => ackMaskSize;
 | 
						||
            set => ackMaskSize = value;
 | 
						||
        }
 | 
						||
    }
 | 
						||
} |