using System; namespace IFramework.Net.KCP { class KcpTool { public const int IKCP_RTO_NDL = 30; // no delay min rto public const int IKCP_RTO_MIN = 100; // normal min rto public const int IKCP_RTO_DEF = 200; public const int IKCP_RTO_MAX = 60000; public const int IKCP_CMD_PUSH = 81; // cmd: push data public const int IKCP_CMD_ACK = 82; // cmd: ack public const int IKCP_CMD_WASK = 83; // cmd: window probe (ask) public const int IKCP_CMD_WINS = 84; // cmd: window size (tell) public const int IKCP_ASK_SEND = 1; // need to send IKCP_CMD_WASK public const int IKCP_ASK_TELL = 2; // need to send IKCP_CMD_WINS public const int IKCP_WND_SND = 32; public const int IKCP_WND_RCV = 32; //public const int IKCP_MTU_DEF = 1400; public const int IKCP_MTU_DEF = 1024; public const int IKCP_ACK_FAST = 3; public const int IKCP_INTERVAL = 100; public const int IKCP_OVERHEAD = 24; public const int IKCP_DEADLINK = 20; public const int IKCP_THRESH_INIT = 2; public const int IKCP_THRESH_MIN = 2; public const int IKCP_PROBE_INIT = 7000; // 7 secs to probe window size public const int IKCP_PROBE_LIMIT = 120000; // up to 120 secs to probe window public const int IKCP_SN_OFFSET = 12; // encode 8 bits unsigned int public static int Encode(byte[] p, int offset, byte c) { p[0 + offset] = c; return 1; } // decode 8 bits unsigned int public static int Decode(byte[] p, int offset, ref byte c) { c = p[0 + offset]; return 1; } /* encode 16 bits unsigned int (lsb) */ public static int Encode(byte[] p, int offset, UInt16 w) { p[0 + offset] = (byte)(w >> 0); p[1 + offset] = (byte)(w >> 8); return 2; } /* decode 16 bits unsigned int (lsb) */ public static int Decode(byte[] p, int offset, ref UInt16 c) { UInt16 result = 0; result |= (UInt16)p[0 + offset]; result |= (UInt16)(p[1 + offset] << 8); c = result; return 2; } /* encode 32 bits unsigned int (lsb) */ public static int Encode(byte[] p, int offset, UInt32 l) { p[0 + offset] = (byte)(l >> 0); p[1 + offset] = (byte)(l >> 8); p[2 + offset] = (byte)(l >> 16); p[3 + offset] = (byte)(l >> 24); return 4; } /* decode 32 bits unsigned int (lsb) */ public static int Decode(byte[] p, int offset, ref UInt32 c) { UInt32 result = 0; result |= (UInt32)p[0 + offset]; result |= (UInt32)(p[1 + offset] << 8); result |= (UInt32)(p[2 + offset] << 16); result |= (UInt32)(p[3 + offset] << 24); c = result; return 4; } public static UInt32 Min(UInt32 a, UInt32 b) => a <= b ? a : b; public static UInt32 Max(UInt32 a, UInt32 b) => a >= b ? a : b; public static UInt32 Clamp(UInt32 lower, UInt32 middle, UInt32 upper) => Min(Max(lower, middle), upper); public static Int32 Subtract(UInt32 later, UInt32 earlier) => ((Int32)(later - earlier)); } }