1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- using System.IO;
- namespace kcp2k
- {
- // KCP Segment Definition
- internal class Segment
- {
- internal uint conv; // conversation
- internal uint cmd; // command, e.g. Kcp.CMD_ACK etc.
- internal uint frg; // fragment
- internal uint wnd; // window size that the receive can currently receive
- internal uint ts; // timestamp
- internal uint sn; // serial number
- internal uint una;
- internal uint resendts; // resend timestamp
- internal int rto;
- internal uint fastack;
- internal uint xmit;
- // we need an auto scaling byte[] with a WriteBytes function.
- // MemoryStream does that perfectly, no need to reinvent the wheel.
- // note: no need to pool it, because Segment is already pooled.
- // -> MTU as initial capacity to avoid most runtime resizing/allocations
- internal MemoryStream data = new MemoryStream(Kcp.MTU_DEF);
- // ikcp_encode_seg
- // encode a segment into buffer
- internal int Encode(byte[] ptr, int offset)
- {
- int offset_ = offset;
- offset += Utils.Encode32U(ptr, offset, conv);
- offset += Utils.Encode8u(ptr, offset, (byte)cmd);
- offset += Utils.Encode8u(ptr, offset, (byte)frg);
- offset += Utils.Encode16U(ptr, offset, (ushort)wnd);
- offset += Utils.Encode32U(ptr, offset, ts);
- offset += Utils.Encode32U(ptr, offset, sn);
- offset += Utils.Encode32U(ptr, offset, una);
- offset += Utils.Encode32U(ptr, offset, (uint)data.Position);
- return offset - offset_;
- }
- // reset to return a fresh segment to the pool
- internal void Reset()
- {
- conv = 0;
- cmd = 0;
- frg = 0;
- wnd = 0;
- ts = 0;
- sn = 0;
- una = 0;
- rto = 0;
- xmit = 0;
- resendts = 0;
- fastack = 0;
- // keep buffer for next pool usage, but reset length (= bytes written)
- data.SetLength(0);
- }
- }
- }
|