123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- using System;
- using System.Runtime.InteropServices;
- namespace ET
- {
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate int KcpOutput(IntPtr buf, int len, IntPtr kcp, IntPtr user);
-
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate void KcpLog(IntPtr buf, int len, IntPtr kcp, IntPtr user);
- public static class Kcp
- {
- public const int OneM = 1024 * 1024;
- public const int InnerMaxWaitSize = 1024 * 1024;
- public const int OuterMaxWaitSize = 1024 * 1024;
-
-
- private static KcpOutput KcpOutput;
- private static KcpLog KcpLog;
-
- #if UNITY_IPHONE && !UNITY_EDITOR
- const string KcpDLL = "__Internal";
- #else
- const string KcpDLL = "kcp";
- #endif
-
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern uint ikcp_check(IntPtr kcp, uint current);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern IntPtr ikcp_create(uint conv, IntPtr user);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern void ikcp_flush(IntPtr kcp);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern uint ikcp_getconv(IntPtr ptr);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern int ikcp_input(IntPtr kcp, byte[] data, int offset, int size);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern int ikcp_nodelay(IntPtr kcp, int nodelay, int interval, int resend, int nc);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern int ikcp_peeksize(IntPtr kcp);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern int ikcp_recv(IntPtr kcp, byte[] buffer, int index, int len);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern void ikcp_release(IntPtr kcp);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern int ikcp_send(IntPtr kcp, byte[] buffer, int offset, int len);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern void ikcp_setminrto(IntPtr ptr, int minrto);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern int ikcp_setmtu(IntPtr kcp, int mtu);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern void ikcp_setoutput(KcpOutput output);
-
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern void ikcp_setlog(KcpLog log);
-
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern void ikcp_update(IntPtr kcp, uint current);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern int ikcp_waitsnd(IntPtr kcp);
- [DllImport(KcpDLL, CallingConvention=CallingConvention.Cdecl)]
- private static extern int ikcp_wndsize(IntPtr kcp, int sndwnd, int rcvwnd);
-
- public static uint KcpCheck(IntPtr kcp, uint current)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- uint ret = ikcp_check(kcp, current);
- return ret;
- }
-
- public static IntPtr KcpCreate(uint conv, IntPtr user)
- {
- return ikcp_create(conv, user);
- }
- public static void KcpFlush(IntPtr kcp)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- ikcp_flush(kcp);
- }
- public static uint KcpGetconv(IntPtr ptr)
- {
- if (ptr == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- return ikcp_getconv(ptr);
- }
- public static int KcpInput(IntPtr kcp, byte[] buffer, int offset, int len)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- if (offset + len > buffer.Length)
- {
- throw new Exception($"kcp error, KcpInput {buffer.Length} {offset} {len}");
- }
- int ret = ikcp_input(kcp, buffer, offset, len);
- return ret;
- }
- public static int KcpNodelay(IntPtr kcp, int nodelay, int interval, int resend, int nc)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- return ikcp_nodelay(kcp, nodelay, interval, resend, nc);
- }
- public static int KcpPeeksize(IntPtr kcp)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- int ret = ikcp_peeksize(kcp);
- return ret;
- }
- public static int KcpRecv(IntPtr kcp, byte[] buffer, int index, int len)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- if (buffer.Length < index + len)
- {
- throw new Exception($"kcp error, KcpRecv error: {index} {len}");
- }
-
- int ret = ikcp_recv(kcp, buffer, index, len);
- return ret;
- }
- public static void KcpRelease(IntPtr kcp)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- ikcp_release(kcp);
- }
- public static int KcpSend(IntPtr kcp, byte[] buffer, int offset, int len)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- if (offset + len > buffer.Length)
- {
- throw new Exception($"kcp error, KcpSend {buffer.Length} {offset} {len}");
- }
-
- int ret = ikcp_send(kcp, buffer, offset, len);
- return ret;
- }
- public static void KcpSetminrto(IntPtr kcp, int minrto)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- ikcp_setminrto(kcp, minrto);
- }
- public static int KcpSetmtu(IntPtr kcp, int mtu)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- return ikcp_setmtu(kcp, mtu);
- }
- public static void KcpSetoutput(KcpOutput output)
- {
- KcpOutput = output;
- ikcp_setoutput(KcpOutput);
- }
-
- public static void KcpSetLog(KcpLog kcpLog)
- {
- KcpLog = kcpLog;
- ikcp_setlog(KcpLog);
- }
- public static void KcpUpdate(IntPtr kcp, uint current)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- ikcp_update(kcp, current);
- }
- public static int KcpWaitsnd(IntPtr kcp)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- int ret = ikcp_waitsnd(kcp);
- return ret;
- }
- public static int KcpWndsize(IntPtr kcp, int sndwnd, int rcvwnd)
- {
- if (kcp == IntPtr.Zero)
- {
- throw new Exception($"kcp error, kcp point is zero");
- }
- return ikcp_wndsize(kcp, sndwnd, rcvwnd);
- }
- }
- }
|