upm_guru_kcp/Runtime/csharp-kcp/base-kcp/Segment.cs

177 lines
4.1 KiB
C#
Raw Permalink Normal View History

2023-08-30 05:50:21 +00:00
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;
}
}
}