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