You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
7.9 KiB
231 lines
7.9 KiB
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); |
|
} |
|
} |
|
} |
|
|
|
|