|
|
@@ -1,7 +1,9 @@
|
|
|
/*
|
|
|
* Managed C# wrapper for an extended version of ENet
|
|
|
+ * This is a fork from upstream and is available at http://github.com/SoftwareGuy/ENet-CSharp
|
|
|
+ *
|
|
|
* Copyright (c) 2019 Matt Coburn (SoftwareGuy/Coburn64), Chris Burns (c6burns)
|
|
|
- * Copyright (c) 2013 - 2018 James Bellinger, Nate Shoffner, Stanislav Denisov
|
|
|
+ * Copyright (c) 2013 James Bellinger, 2016 Nate Shoffner, 2018 Stanislav Denisov
|
|
|
*
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
|
@@ -27,1173 +29,1115 @@ using System.Runtime.InteropServices;
|
|
|
using System.Security;
|
|
|
using System.Text;
|
|
|
|
|
|
-namespace ENet
|
|
|
-{
|
|
|
- [Flags]
|
|
|
- public enum PacketFlags
|
|
|
- {
|
|
|
- None = 0,
|
|
|
- Reliable = 1 << 0,
|
|
|
- Unsequenced = 1 << 1,
|
|
|
- NoAllocate = 1 << 2,
|
|
|
- UnreliableFragmented = 1 << 3,
|
|
|
- Instant = 1 << 4
|
|
|
- }
|
|
|
-
|
|
|
- public enum EventType
|
|
|
- {
|
|
|
- None = 0,
|
|
|
- Connect = 1,
|
|
|
- Disconnect = 2,
|
|
|
- Receive = 3,
|
|
|
- Timeout = 4
|
|
|
- }
|
|
|
-
|
|
|
- public enum PeerState
|
|
|
- {
|
|
|
- Uninitialized = -1,
|
|
|
- Disconnected = 0,
|
|
|
- Connecting = 1,
|
|
|
- AcknowledgingConnect = 2,
|
|
|
- ConnectionPending = 3,
|
|
|
- ConnectionSucceeded = 4,
|
|
|
- Connected = 5,
|
|
|
- DisconnectLater = 6,
|
|
|
- Disconnecting = 7,
|
|
|
- AcknowledgingDisconnect = 8,
|
|
|
- Zombie = 9
|
|
|
- }
|
|
|
-
|
|
|
- [StructLayout(LayoutKind.Explicit, Size = 18)]
|
|
|
- internal struct ENetAddress
|
|
|
- {
|
|
|
- [FieldOffset(16)]
|
|
|
- public ushort port;
|
|
|
- }
|
|
|
-
|
|
|
- [StructLayout(LayoutKind.Sequential)]
|
|
|
- internal struct ENetEvent
|
|
|
- {
|
|
|
- public EventType type;
|
|
|
- public IntPtr peer;
|
|
|
- public byte channelID;
|
|
|
- public uint data;
|
|
|
- public IntPtr packet;
|
|
|
- }
|
|
|
-
|
|
|
- [StructLayout(LayoutKind.Sequential)]
|
|
|
- internal struct ENetCallbacks
|
|
|
- {
|
|
|
- public AllocCallback malloc;
|
|
|
- public FreeCallback free;
|
|
|
- public NoMemoryCallback noMemory;
|
|
|
- }
|
|
|
-
|
|
|
- public delegate IntPtr AllocCallback(IntPtr size);
|
|
|
- public delegate void FreeCallback(IntPtr memory);
|
|
|
- public delegate void NoMemoryCallback();
|
|
|
- public delegate void PacketFreeCallback(Packet packet);
|
|
|
-
|
|
|
- internal static class ArrayPool
|
|
|
- {
|
|
|
- [ThreadStatic]
|
|
|
- private static byte[] byteBuffer;
|
|
|
- [ThreadStatic]
|
|
|
- private static IntPtr[] pointerBuffer;
|
|
|
-
|
|
|
- public static byte[] GetByteBuffer()
|
|
|
- {
|
|
|
- if (byteBuffer == null)
|
|
|
- byteBuffer = new byte[64];
|
|
|
-
|
|
|
- return byteBuffer;
|
|
|
- }
|
|
|
-
|
|
|
- public static IntPtr[] GetPointerBuffer()
|
|
|
- {
|
|
|
- if (pointerBuffer == null)
|
|
|
- pointerBuffer = new IntPtr[Library.maxPeers];
|
|
|
-
|
|
|
- return pointerBuffer;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public struct Address
|
|
|
- {
|
|
|
- private ENetAddress nativeAddress;
|
|
|
-
|
|
|
- internal ENetAddress NativeData {
|
|
|
- get {
|
|
|
- return nativeAddress;
|
|
|
- }
|
|
|
-
|
|
|
- set {
|
|
|
- nativeAddress = value;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- internal Address(ENetAddress address)
|
|
|
- {
|
|
|
- nativeAddress = address;
|
|
|
- }
|
|
|
-
|
|
|
- public ushort Port {
|
|
|
- get {
|
|
|
- return nativeAddress.port;
|
|
|
- }
|
|
|
-
|
|
|
- set {
|
|
|
- nativeAddress.port = value;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public string GetIP()
|
|
|
- {
|
|
|
- StringBuilder ip = new StringBuilder(1024);
|
|
|
+namespace ENet {
|
|
|
+ [Flags]
|
|
|
+ public enum PacketFlags {
|
|
|
+ None = 0,
|
|
|
+ Reliable = 1 << 0,
|
|
|
+ Unsequenced = 1 << 1,
|
|
|
+ NoAllocate = 1 << 2,
|
|
|
+ UnreliableFragmented = 1 << 3,
|
|
|
+ Instant = 1 << 4,
|
|
|
+ Crucial = 1 << 5,
|
|
|
+ Sent = 1 << 8
|
|
|
+ }
|
|
|
+
|
|
|
+ public enum EventType {
|
|
|
+ None = 0,
|
|
|
+ Connect = 1,
|
|
|
+ Disconnect = 2,
|
|
|
+ Receive = 3,
|
|
|
+ Timeout = 4
|
|
|
+ }
|
|
|
+
|
|
|
+ public enum PeerState {
|
|
|
+ Uninitialized = -1,
|
|
|
+ Disconnected = 0,
|
|
|
+ Connecting = 1,
|
|
|
+ AcknowledgingConnect = 2,
|
|
|
+ ConnectionPending = 3,
|
|
|
+ ConnectionSucceeded = 4,
|
|
|
+ Connected = 5,
|
|
|
+ DisconnectLater = 6,
|
|
|
+ Disconnecting = 7,
|
|
|
+ AcknowledgingDisconnect = 8,
|
|
|
+ Zombie = 9
|
|
|
+ }
|
|
|
+
|
|
|
+ [StructLayout(LayoutKind.Explicit, Size = 18)]
|
|
|
+ internal struct ENetAddress {
|
|
|
+ [FieldOffset(16)]
|
|
|
+ public ushort port;
|
|
|
+ }
|
|
|
+
|
|
|
+ [StructLayout(LayoutKind.Sequential)]
|
|
|
+ internal struct ENetEvent {
|
|
|
+ public EventType type;
|
|
|
+ public IntPtr peer;
|
|
|
+ public byte channelID;
|
|
|
+ public uint data;
|
|
|
+ public IntPtr packet;
|
|
|
+ }
|
|
|
+
|
|
|
+ [StructLayout(LayoutKind.Sequential)]
|
|
|
+ internal struct ENetCallbacks {
|
|
|
+ public AllocCallback malloc;
|
|
|
+ public FreeCallback free;
|
|
|
+ public NoMemoryCallback noMemory;
|
|
|
+ }
|
|
|
+
|
|
|
+ public delegate IntPtr AllocCallback(IntPtr size);
|
|
|
+ public delegate void FreeCallback(IntPtr memory);
|
|
|
+ public delegate void NoMemoryCallback();
|
|
|
+ public delegate void PacketFreeCallback(Packet packet);
|
|
|
+
|
|
|
+ internal static class ArrayPool {
|
|
|
+ [ThreadStatic]
|
|
|
+ private static byte[] byteBuffer;
|
|
|
+ [ThreadStatic]
|
|
|
+ private static IntPtr[] pointerBuffer;
|
|
|
+
|
|
|
+ public static byte[] GetByteBuffer() {
|
|
|
+ if (byteBuffer == null)
|
|
|
+ byteBuffer = new byte[64];
|
|
|
+
|
|
|
+ return byteBuffer;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static IntPtr[] GetPointerBuffer() {
|
|
|
+ if (pointerBuffer == null)
|
|
|
+ pointerBuffer = new IntPtr[Library.maxPeers];
|
|
|
+
|
|
|
+ return pointerBuffer;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public struct Address {
|
|
|
+ private ENetAddress nativeAddress;
|
|
|
+
|
|
|
+ internal ENetAddress NativeData {
|
|
|
+ get {
|
|
|
+ return nativeAddress;
|
|
|
+ }
|
|
|
+
|
|
|
+ set {
|
|
|
+ nativeAddress = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ internal Address(ENetAddress address) {
|
|
|
+ nativeAddress = address;
|
|
|
+ }
|
|
|
+
|
|
|
+ public ushort Port {
|
|
|
+ get {
|
|
|
+ return nativeAddress.port;
|
|
|
+ }
|
|
|
+
|
|
|
+ set {
|
|
|
+ nativeAddress.port = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public string GetIP() {
|
|
|
+ StringBuilder ip = new StringBuilder(1025);
|
|
|
+
|
|
|
+ if (Native.enet_address_get_ip(ref nativeAddress, ip, (IntPtr)ip.Capacity) != 0)
|
|
|
+ return String.Empty;
|
|
|
+
|
|
|
+ return ip.ToString();
|
|
|
+ }
|
|
|
+
|
|
|
+ public bool SetIP(string ip) {
|
|
|
+ if (ip == null)
|
|
|
+ throw new ArgumentNullException("ip");
|
|
|
+
|
|
|
+ return Native.enet_address_set_ip(ref nativeAddress, ip) == 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public string GetHost() {
|
|
|
+ StringBuilder hostName = new StringBuilder(1025);
|
|
|
+
|
|
|
+ if (Native.enet_address_get_hostname(ref nativeAddress, hostName, (IntPtr)hostName.Capacity) != 0)
|
|
|
+ return String.Empty;
|
|
|
+
|
|
|
+ return hostName.ToString();
|
|
|
+ }
|
|
|
+
|
|
|
+ public bool SetHost(string hostName) {
|
|
|
+ if (hostName == null)
|
|
|
+ throw new ArgumentNullException("hostName");
|
|
|
+
|
|
|
+ return Native.enet_address_set_hostname(ref nativeAddress, hostName) == 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public struct Event {
|
|
|
+ private ENetEvent nativeEvent;
|
|
|
+
|
|
|
+ internal ENetEvent NativeData {
|
|
|
+ get {
|
|
|
+ return nativeEvent;
|
|
|
+ }
|
|
|
+
|
|
|
+ set {
|
|
|
+ nativeEvent = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ internal Event(ENetEvent @event) {
|
|
|
+ nativeEvent = @event;
|
|
|
+ }
|
|
|
+
|
|
|
+ public EventType Type {
|
|
|
+ get {
|
|
|
+ return nativeEvent.type;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Peer Peer {
|
|
|
+ get {
|
|
|
+ return new Peer(nativeEvent.peer);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public byte ChannelID {
|
|
|
+ get {
|
|
|
+ return nativeEvent.channelID;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public uint Data {
|
|
|
+ get {
|
|
|
+ return nativeEvent.data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Packet Packet {
|
|
|
+ get {
|
|
|
+ return new Packet(nativeEvent.packet);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class Callbacks {
|
|
|
+ private ENetCallbacks nativeCallbacks;
|
|
|
+
|
|
|
+ internal ENetCallbacks NativeData {
|
|
|
+ get {
|
|
|
+ return nativeCallbacks;
|
|
|
+ }
|
|
|
+
|
|
|
+ set {
|
|
|
+ nativeCallbacks = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Callbacks(AllocCallback allocCallback, FreeCallback freeCallback, NoMemoryCallback noMemoryCallback) {
|
|
|
+ nativeCallbacks.malloc = allocCallback;
|
|
|
+ nativeCallbacks.free = freeCallback;
|
|
|
+ nativeCallbacks.noMemory = noMemoryCallback;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public struct Packet : IDisposable {
|
|
|
+ private IntPtr nativePacket;
|
|
|
+
|
|
|
+ internal IntPtr NativeData {
|
|
|
+ get {
|
|
|
+ return nativePacket;
|
|
|
+ }
|
|
|
+
|
|
|
+ set {
|
|
|
+ nativePacket = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ internal Packet(IntPtr packet) {
|
|
|
+ nativePacket = packet;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Dispose() {
|
|
|
+ if (nativePacket != IntPtr.Zero) {
|
|
|
+ Native.enet_packet_dispose(nativePacket);
|
|
|
+ nativePacket = IntPtr.Zero;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public bool IsSet {
|
|
|
+ get {
|
|
|
+ return nativePacket != IntPtr.Zero;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public IntPtr Data {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
+
|
|
|
+ return Native.enet_packet_get_data(nativePacket);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public IntPtr UserData {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
+
|
|
|
+ return Native.enet_packet_get_user_data(nativePacket);
|
|
|
+ }
|
|
|
+
|
|
|
+ set {
|
|
|
+ IsCreated();
|
|
|
+
|
|
|
+ Native.enet_packet_set_user_data(nativePacket, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public int Length {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
+
|
|
|
+ return Native.enet_packet_get_length(nativePacket);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (Native.enet_address_get_host_ip(nativeAddress, ip, (IntPtr)ip.Capacity) != 0)
|
|
|
- return String.Empty;
|
|
|
+ public bool HasReferences {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return ip.ToString();
|
|
|
- }
|
|
|
+ return Native.enet_packet_check_references(nativePacket) != 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public bool SetIP(string ip)
|
|
|
- {
|
|
|
- if (ip == null)
|
|
|
- throw new ArgumentNullException("ip");
|
|
|
+ internal void IsCreated() {
|
|
|
+ if (nativePacket == IntPtr.Zero)
|
|
|
+ throw new InvalidOperationException("Packet not created");
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_address_set_host_ip(ref nativeAddress, ip) == 0;
|
|
|
- }
|
|
|
+ public void SetFreeCallback(IntPtr callback) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- public string GetHost()
|
|
|
- {
|
|
|
- StringBuilder hostName = new StringBuilder(1024);
|
|
|
+ Native.enet_packet_set_free_callback(nativePacket, callback);
|
|
|
+ }
|
|
|
|
|
|
- if (Native.enet_address_get_host(nativeAddress, hostName, (IntPtr)hostName.Capacity) != 0)
|
|
|
- return String.Empty;
|
|
|
+ public void SetFreeCallback(PacketFreeCallback callback) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return hostName.ToString();
|
|
|
- }
|
|
|
+ Native.enet_packet_set_free_callback(nativePacket, Marshal.GetFunctionPointerForDelegate(callback));
|
|
|
+ }
|
|
|
|
|
|
- public bool SetHost(string hostName)
|
|
|
- {
|
|
|
- if (hostName == null)
|
|
|
- throw new ArgumentNullException("hostName");
|
|
|
+ public void Create(byte[] data) {
|
|
|
+ if (data == null)
|
|
|
+ throw new ArgumentNullException("data");
|
|
|
|
|
|
- return Native.enet_address_set_host(ref nativeAddress, hostName) == 0;
|
|
|
- }
|
|
|
- }
|
|
|
+ Create(data, data.Length);
|
|
|
+ }
|
|
|
|
|
|
- public struct Event
|
|
|
- {
|
|
|
- private ENetEvent nativeEvent;
|
|
|
+ public void Create(byte[] data, int length) {
|
|
|
+ Create(data, length, PacketFlags.None);
|
|
|
+ }
|
|
|
|
|
|
- internal ENetEvent NativeData {
|
|
|
- get {
|
|
|
- return nativeEvent;
|
|
|
- }
|
|
|
+ public void Create(byte[] data, PacketFlags flags) {
|
|
|
+ Create(data, data.Length, flags);
|
|
|
+ }
|
|
|
|
|
|
- set {
|
|
|
- nativeEvent = value;
|
|
|
- }
|
|
|
- }
|
|
|
+ public void Create(byte[] data, int length, PacketFlags flags) {
|
|
|
+ if (data == null)
|
|
|
+ throw new ArgumentNullException("data");
|
|
|
|
|
|
- internal Event(ENetEvent @event)
|
|
|
- {
|
|
|
- nativeEvent = @event;
|
|
|
- }
|
|
|
+ if (length < 0 || length > data.Length)
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
|
|
|
- public EventType Type {
|
|
|
- get {
|
|
|
- return nativeEvent.type;
|
|
|
- }
|
|
|
- }
|
|
|
+ nativePacket = Native.enet_packet_create(data, (IntPtr)length, flags);
|
|
|
+ }
|
|
|
|
|
|
- public Peer Peer {
|
|
|
- get {
|
|
|
- return new Peer(nativeEvent.peer);
|
|
|
- }
|
|
|
- }
|
|
|
+ public void Create(IntPtr data, int length, PacketFlags flags) {
|
|
|
+ if (data == IntPtr.Zero)
|
|
|
+ throw new ArgumentNullException("data");
|
|
|
|
|
|
- public byte ChannelID {
|
|
|
- get {
|
|
|
- return nativeEvent.channelID;
|
|
|
- }
|
|
|
- }
|
|
|
+ if (length < 0)
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
|
|
|
- public uint Data {
|
|
|
- get {
|
|
|
- return nativeEvent.data;
|
|
|
- }
|
|
|
- }
|
|
|
+ nativePacket = Native.enet_packet_create(data, (IntPtr)length, flags);
|
|
|
+ }
|
|
|
|
|
|
- public Packet Packet {
|
|
|
- get {
|
|
|
- return new Packet(nativeEvent.packet);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ public void Create(byte[] data, int offset, int length, PacketFlags flags) {
|
|
|
+ if (data == null)
|
|
|
+ throw new ArgumentNullException("data");
|
|
|
|
|
|
- public class Callbacks
|
|
|
- {
|
|
|
- private ENetCallbacks nativeCallbacks;
|
|
|
+ if (offset < 0 || length < 0 || length > data.Length)
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
|
|
|
- internal ENetCallbacks NativeData {
|
|
|
- get {
|
|
|
- return nativeCallbacks;
|
|
|
- }
|
|
|
+ nativePacket = Native.enet_packet_create_offset(data, (IntPtr)length, (IntPtr)offset, flags);
|
|
|
+ }
|
|
|
|
|
|
- set {
|
|
|
- nativeCallbacks = value;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public Callbacks(AllocCallback allocCallback, FreeCallback freeCallback, NoMemoryCallback noMemoryCallback)
|
|
|
- {
|
|
|
- nativeCallbacks.malloc = allocCallback;
|
|
|
- nativeCallbacks.free = freeCallback;
|
|
|
- nativeCallbacks.noMemory = noMemoryCallback;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public struct Packet : IDisposable
|
|
|
- {
|
|
|
- private IntPtr nativePacket;
|
|
|
-
|
|
|
- internal IntPtr NativeData {
|
|
|
- get {
|
|
|
- return nativePacket;
|
|
|
- }
|
|
|
+ public void Create(IntPtr data, int offset, int length, PacketFlags flags) {
|
|
|
+ if (data == IntPtr.Zero)
|
|
|
+ throw new ArgumentNullException("data");
|
|
|
|
|
|
- set {
|
|
|
- nativePacket = value;
|
|
|
- }
|
|
|
- }
|
|
|
+ if (offset < 0 || length < 0)
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
|
|
|
- internal Packet(IntPtr packet)
|
|
|
- {
|
|
|
- nativePacket = packet;
|
|
|
- }
|
|
|
+ nativePacket = Native.enet_packet_create_offset(data, (IntPtr)length, (IntPtr)offset, flags);
|
|
|
+ }
|
|
|
|
|
|
- public void Dispose()
|
|
|
- {
|
|
|
- if (nativePacket != IntPtr.Zero)
|
|
|
+ public void CopyTo(byte[] destination) {
|
|
|
+ if (destination == null)
|
|
|
+ throw new ArgumentNullException("destination");
|
|
|
+
|
|
|
+ // Fix by katori, prevents trying to copy a NULL
|
|
|
+ // from native world (ie. disconnect a client)
|
|
|
+ if (Data == null)
|
|
|
{
|
|
|
- Native.enet_packet_dispose(nativePacket);
|
|
|
- nativePacket = IntPtr.Zero;
|
|
|
+ return;
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
+ Marshal.Copy(Data, destination, 0, Length);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class Host : IDisposable {
|
|
|
+ private IntPtr nativeHost;
|
|
|
+
|
|
|
+ internal IntPtr NativeData {
|
|
|
+ get {
|
|
|
+ return nativeHost;
|
|
|
+ }
|
|
|
+
|
|
|
+ set {
|
|
|
+ nativeHost = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Dispose() {
|
|
|
+ Dispose(true);
|
|
|
+ GC.SuppressFinalize(this);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected virtual void Dispose(bool disposing) {
|
|
|
+ if (nativeHost != IntPtr.Zero) {
|
|
|
+ Native.enet_host_destroy(nativeHost);
|
|
|
+ nativeHost = IntPtr.Zero;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ~Host() {
|
|
|
+ Dispose(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ public bool IsSet {
|
|
|
+ get {
|
|
|
+ return nativeHost != IntPtr.Zero;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public uint PeersCount {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
+
|
|
|
+ return Native.enet_host_get_peers_count(nativeHost);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public bool IsSet {
|
|
|
- get {
|
|
|
- return nativePacket != IntPtr.Zero;
|
|
|
- }
|
|
|
- }
|
|
|
+ public uint PacketsSent {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
+
|
|
|
+ return Native.enet_host_get_packets_sent(nativeHost);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public IntPtr Data {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ public uint PacketsReceived {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
+
|
|
|
+ return Native.enet_host_get_packets_received(nativeHost);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_packet_get_data(nativePacket);
|
|
|
- }
|
|
|
- }
|
|
|
+ public uint BytesSent {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- public int Length {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ return Native.enet_host_get_bytes_sent(nativeHost);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_packet_get_length(nativePacket);
|
|
|
- }
|
|
|
- }
|
|
|
+ public uint BytesReceived {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
+
|
|
|
+ return Native.enet_host_get_bytes_received(nativeHost);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public bool HasReferences {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ internal void IsCreated() {
|
|
|
+ if (nativeHost == IntPtr.Zero)
|
|
|
+ throw new InvalidOperationException("Host not created");
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_packet_check_references(nativePacket) != 0;
|
|
|
- }
|
|
|
- }
|
|
|
+ private void IsChannelLimited(int channelLimit) {
|
|
|
+ if (channelLimit < 0 || channelLimit > Library.maxChannelCount)
|
|
|
+ throw new ArgumentOutOfRangeException("channelLimit");
|
|
|
+ }
|
|
|
|
|
|
- internal void CheckCreated()
|
|
|
- {
|
|
|
- if (nativePacket == IntPtr.Zero)
|
|
|
- throw new InvalidOperationException("Packet not created");
|
|
|
- }
|
|
|
+ public void Create() {
|
|
|
+ Create(null, 1, 0);
|
|
|
+ }
|
|
|
|
|
|
- public void SetFreeCallback(IntPtr callback)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ public void Create(int bufferSize) {
|
|
|
+ Create(null, 1, 0, 0, 0, bufferSize);
|
|
|
+ }
|
|
|
|
|
|
- Native.enet_packet_set_free_callback(nativePacket, callback);
|
|
|
- }
|
|
|
+ public void Create(Address? address, int peerLimit) {
|
|
|
+ Create(address, peerLimit, 0);
|
|
|
+ }
|
|
|
|
|
|
- public void SetFreeCallback(PacketFreeCallback callback)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ public void Create(Address? address, int peerLimit, int channelLimit) {
|
|
|
+ Create(address, peerLimit, channelLimit, 0, 0, 0);
|
|
|
+ }
|
|
|
|
|
|
- Native.enet_packet_set_free_callback(nativePacket, Marshal.GetFunctionPointerForDelegate(callback));
|
|
|
- }
|
|
|
+ public void Create(int peerLimit, int channelLimit) {
|
|
|
+ Create(null, peerLimit, channelLimit, 0, 0, 0);
|
|
|
+ }
|
|
|
|
|
|
- public void Create(byte[] data)
|
|
|
- {
|
|
|
- if (data == null)
|
|
|
- throw new ArgumentNullException("data");
|
|
|
+ public void Create(int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth) {
|
|
|
+ Create(null, peerLimit, channelLimit, incomingBandwidth, outgoingBandwidth, 0);
|
|
|
+ }
|
|
|
|
|
|
- Create(data, data.Length);
|
|
|
- }
|
|
|
+ public void Create(Address? address, int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth) {
|
|
|
+ Create(address, peerLimit, channelLimit, incomingBandwidth, outgoingBandwidth, 0);
|
|
|
+ }
|
|
|
|
|
|
- public void Create(byte[] data, int length)
|
|
|
- {
|
|
|
- Create(data, length, PacketFlags.None);
|
|
|
- }
|
|
|
+ public void Create(Address? address, int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize) {
|
|
|
+ if (nativeHost != IntPtr.Zero)
|
|
|
+ throw new InvalidOperationException("Host already created");
|
|
|
|
|
|
- public void Create(byte[] data, PacketFlags flags)
|
|
|
- {
|
|
|
- Create(data, data.Length, flags);
|
|
|
- }
|
|
|
+ if (peerLimit < 0 || peerLimit > Library.maxPeers)
|
|
|
+ throw new ArgumentOutOfRangeException("peerLimit");
|
|
|
|
|
|
- public void Create(byte[] data, int length, PacketFlags flags)
|
|
|
- {
|
|
|
- if (data == null)
|
|
|
- throw new ArgumentNullException("data");
|
|
|
+ IsChannelLimited(channelLimit);
|
|
|
|
|
|
- if (length < 0 || length > data.Length)
|
|
|
- throw new ArgumentOutOfRangeException();
|
|
|
+ if (address != null) {
|
|
|
+ var nativeAddress = address.Value.NativeData;
|
|
|
|
|
|
- nativePacket = Native.enet_packet_create(data, (IntPtr)length, flags);
|
|
|
- }
|
|
|
+ nativeHost = Native.enet_host_create(ref nativeAddress, (IntPtr)peerLimit, (IntPtr)channelLimit, incomingBandwidth, outgoingBandwidth, bufferSize);
|
|
|
+ } else {
|
|
|
+ nativeHost = Native.enet_host_create(IntPtr.Zero, (IntPtr)peerLimit, (IntPtr)channelLimit, incomingBandwidth, outgoingBandwidth, bufferSize);
|
|
|
+ }
|
|
|
|
|
|
- public void Create(IntPtr data, int length, PacketFlags flags)
|
|
|
- {
|
|
|
- if (data == IntPtr.Zero)
|
|
|
- throw new ArgumentNullException("data");
|
|
|
+ if (nativeHost == IntPtr.Zero)
|
|
|
+ throw new InvalidOperationException("Host creation call failed");
|
|
|
+ }
|
|
|
|
|
|
- if (length < 0)
|
|
|
- throw new ArgumentOutOfRangeException();
|
|
|
+ public void PreventConnections(bool state) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- nativePacket = Native.enet_packet_create(data, (IntPtr)length, flags);
|
|
|
- }
|
|
|
+ Native.enet_host_prevent_connections(nativeHost, (byte)(state ? 1 : 0));
|
|
|
+ }
|
|
|
|
|
|
- public void Create(byte[] data, int offset, int length, PacketFlags flags)
|
|
|
- {
|
|
|
- if (data == null)
|
|
|
- throw new ArgumentNullException("data");
|
|
|
+ public void Broadcast(byte channelID, ref Packet packet) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- if (offset < 0 || length < 0 || length > data.Length)
|
|
|
- throw new ArgumentOutOfRangeException();
|
|
|
+ packet.IsCreated();
|
|
|
+ Native.enet_host_broadcast(nativeHost, channelID, packet.NativeData);
|
|
|
+ packet.NativeData = IntPtr.Zero;
|
|
|
+ }
|
|
|
|
|
|
- nativePacket = Native.enet_packet_create_offset(data, (IntPtr)length, (IntPtr)offset, flags);
|
|
|
- }
|
|
|
+ public void Broadcast(byte channelID, ref Packet packet, Peer excludedPeer) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- public void Create(IntPtr data, int offset, int length, PacketFlags flags)
|
|
|
- {
|
|
|
- if (data == IntPtr.Zero)
|
|
|
- throw new ArgumentNullException("data");
|
|
|
+ packet.IsCreated();
|
|
|
+ Native.enet_host_broadcast_exclude(nativeHost, channelID, packet.NativeData, excludedPeer.NativeData);
|
|
|
+ packet.NativeData = IntPtr.Zero;
|
|
|
+ }
|
|
|
|
|
|
- if (offset < 0 || length < 0)
|
|
|
- throw new ArgumentOutOfRangeException();
|
|
|
+ public void Broadcast(byte channelID, ref Packet packet, Peer[] peers) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- nativePacket = Native.enet_packet_create_offset(data, (IntPtr)length, (IntPtr)offset, flags);
|
|
|
- }
|
|
|
+ packet.IsCreated();
|
|
|
|
|
|
- public void CopyTo(byte[] destination)
|
|
|
- {
|
|
|
- if (destination == null)
|
|
|
- throw new ArgumentNullException("destination");
|
|
|
- if (Data == null)
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
- Marshal.Copy(Data, destination, 0, Length);
|
|
|
- }
|
|
|
- }
|
|
|
+ if (peers.Length > 0) {
|
|
|
+ IntPtr[] nativePeers = ArrayPool.GetPointerBuffer();
|
|
|
+ int nativeCount = 0;
|
|
|
|
|
|
- public class Host : IDisposable
|
|
|
- {
|
|
|
- private IntPtr nativeHost;
|
|
|
+ for (int i = 0; i < peers.Length; i++) {
|
|
|
+ if (peers[i].NativeData != IntPtr.Zero) {
|
|
|
+ nativePeers[nativeCount] = peers[i].NativeData;
|
|
|
+ nativeCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- internal IntPtr NativeData {
|
|
|
- get {
|
|
|
- return nativeHost;
|
|
|
- }
|
|
|
+ Native.enet_host_broadcast_selective(nativeHost, channelID, packet.NativeData, nativePeers, (IntPtr)nativeCount);
|
|
|
+ }
|
|
|
|
|
|
- set {
|
|
|
- nativeHost = value;
|
|
|
- }
|
|
|
- }
|
|
|
+ packet.NativeData = IntPtr.Zero;
|
|
|
+ }
|
|
|
|
|
|
- public void Dispose()
|
|
|
- {
|
|
|
- Dispose(true);
|
|
|
- GC.SuppressFinalize(this);
|
|
|
- }
|
|
|
+ public int CheckEvents(out Event @event) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- protected virtual void Dispose(bool disposing)
|
|
|
- {
|
|
|
- if (nativeHost != IntPtr.Zero)
|
|
|
- {
|
|
|
- Native.enet_host_destroy(nativeHost);
|
|
|
- nativeHost = IntPtr.Zero;
|
|
|
- }
|
|
|
- }
|
|
|
+ ENetEvent nativeEvent;
|
|
|
|
|
|
- ~Host()
|
|
|
- {
|
|
|
- Dispose(false);
|
|
|
- }
|
|
|
+ var result = Native.enet_host_check_events(nativeHost, out nativeEvent);
|
|
|
|
|
|
- public bool IsSet {
|
|
|
- get {
|
|
|
- return nativeHost != IntPtr.Zero;
|
|
|
- }
|
|
|
- }
|
|
|
+ if (result <= 0) {
|
|
|
+ @event = default;
|
|
|
|
|
|
- public uint PeersCount {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_host_get_peers_count(nativeHost);
|
|
|
- }
|
|
|
- }
|
|
|
+ @event = new Event(nativeEvent);
|
|
|
|
|
|
- public uint PacketsSent {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_host_get_packets_sent(nativeHost);
|
|
|
- }
|
|
|
- }
|
|
|
+ public Peer Connect(Address address) {
|
|
|
+ return Connect(address, 0, 0);
|
|
|
+ }
|
|
|
|
|
|
- public uint PacketsReceived {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ public Peer Connect(Address address, int channelLimit) {
|
|
|
+ return Connect(address, channelLimit, 0);
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_host_get_packets_received(nativeHost);
|
|
|
- }
|
|
|
- }
|
|
|
+ public Peer Connect(Address address, int channelLimit, uint data) {
|
|
|
+ IsCreated();
|
|
|
+ IsChannelLimited(channelLimit);
|
|
|
|
|
|
- public uint BytesSent {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ var nativeAddress = address.NativeData;
|
|
|
+ var peer = new Peer(Native.enet_host_connect(nativeHost, ref nativeAddress, (IntPtr)channelLimit, data));
|
|
|
|
|
|
- return Native.enet_host_get_bytes_sent(nativeHost);
|
|
|
- }
|
|
|
- }
|
|
|
+ if (peer.NativeData == IntPtr.Zero)
|
|
|
+ throw new InvalidOperationException("Host connect call failed");
|
|
|
|
|
|
- public uint BytesReceived {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ return peer;
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_host_get_bytes_received(nativeHost);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- internal void CheckCreated()
|
|
|
- {
|
|
|
- if (nativeHost == IntPtr.Zero)
|
|
|
- throw new InvalidOperationException("Host not created");
|
|
|
- }
|
|
|
-
|
|
|
- private void CheckChannelLimit(int channelLimit)
|
|
|
- {
|
|
|
- if (channelLimit < 0 || channelLimit > Library.maxChannelCount)
|
|
|
- throw new ArgumentOutOfRangeException("channelLimit");
|
|
|
- }
|
|
|
-
|
|
|
- public void Create()
|
|
|
- {
|
|
|
- Create(null, 1, 0);
|
|
|
- }
|
|
|
-
|
|
|
- public void Create(int bufferSize)
|
|
|
- {
|
|
|
- Create(null, 1, 0, 0, 0, bufferSize);
|
|
|
- }
|
|
|
-
|
|
|
- public void Create(Address? address, int peerLimit)
|
|
|
- {
|
|
|
- Create(address, peerLimit, 0);
|
|
|
- }
|
|
|
-
|
|
|
- public void Create(Address? address, int peerLimit, int channelLimit)
|
|
|
- {
|
|
|
- Create(address, peerLimit, channelLimit, 0, 0, 0);
|
|
|
- }
|
|
|
-
|
|
|
- public void Create(int peerLimit, int channelLimit)
|
|
|
- {
|
|
|
- Create(null, peerLimit, channelLimit, 0, 0, 0);
|
|
|
- }
|
|
|
-
|
|
|
- public void Create(int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth)
|
|
|
- {
|
|
|
- Create(null, peerLimit, channelLimit, incomingBandwidth, outgoingBandwidth, 0);
|
|
|
- }
|
|
|
-
|
|
|
- public void Create(Address? address, int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth)
|
|
|
- {
|
|
|
- Create(address, peerLimit, channelLimit, incomingBandwidth, outgoingBandwidth, 0);
|
|
|
- }
|
|
|
-
|
|
|
- public void Create(Address? address, int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize)
|
|
|
- {
|
|
|
- if (nativeHost != IntPtr.Zero)
|
|
|
- throw new InvalidOperationException("Host already created");
|
|
|
-
|
|
|
- if (peerLimit < 0 || peerLimit > Library.maxPeers)
|
|
|
- throw new ArgumentOutOfRangeException("peerLimit");
|
|
|
-
|
|
|
- CheckChannelLimit(channelLimit);
|
|
|
-
|
|
|
- if (address != null)
|
|
|
- {
|
|
|
- ENetAddress nativeAddress = address.Value.NativeData;
|
|
|
+ public int Service(int timeout, out Event @event) {
|
|
|
+ if (timeout < 0)
|
|
|
+ throw new ArgumentOutOfRangeException("timeout");
|
|
|
|
|
|
- nativeHost = Native.enet_host_create(ref nativeAddress, (IntPtr)peerLimit, (IntPtr)channelLimit, incomingBandwidth, outgoingBandwidth, bufferSize);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- nativeHost = Native.enet_host_create(IntPtr.Zero, (IntPtr)peerLimit, (IntPtr)channelLimit, incomingBandwidth, outgoingBandwidth, bufferSize);
|
|
|
- }
|
|
|
+ IsCreated();
|
|
|
|
|
|
- if (nativeHost == IntPtr.Zero)
|
|
|
- throw new InvalidOperationException("Host creation call failed");
|
|
|
- }
|
|
|
+ ENetEvent nativeEvent;
|
|
|
|
|
|
- public void EnableCompression()
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ var result = Native.enet_host_service(nativeHost, out nativeEvent, (uint)timeout);
|
|
|
|
|
|
- Native.enet_host_enable_compression(nativeHost);
|
|
|
- }
|
|
|
+ if (result <= 0) {
|
|
|
+ @event = default;
|
|
|
|
|
|
- public void PreventConnections(bool state)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
|
|
|
- Native.enet_host_prevent_connections(nativeHost, (byte)(state ? 1 : 0));
|
|
|
- }
|
|
|
+ @event = new Event(nativeEvent);
|
|
|
|
|
|
- public void Broadcast(byte channelID, ref Packet packet)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
|
|
|
- packet.CheckCreated();
|
|
|
- Native.enet_host_broadcast(nativeHost, channelID, packet.NativeData);
|
|
|
- packet.NativeData = IntPtr.Zero;
|
|
|
- }
|
|
|
+ public void SetBandwidthLimit(uint incomingBandwidth, uint outgoingBandwidth) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- public void Broadcast(byte channelID, ref Packet packet, Peer excludedPeer)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ Native.enet_host_bandwidth_limit(nativeHost, incomingBandwidth, outgoingBandwidth);
|
|
|
+ }
|
|
|
|
|
|
- packet.CheckCreated();
|
|
|
- Native.enet_host_broadcast_exclude(nativeHost, channelID, packet.NativeData, excludedPeer.NativeData);
|
|
|
- packet.NativeData = IntPtr.Zero;
|
|
|
- }
|
|
|
+ public void SetChannelLimit(int channelLimit) {
|
|
|
+ IsCreated();
|
|
|
+ IsChannelLimited(channelLimit);
|
|
|
|
|
|
- public void Broadcast(byte channelID, ref Packet packet, Peer[] peers)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ Native.enet_host_channel_limit(nativeHost, (IntPtr)channelLimit);
|
|
|
+ }
|
|
|
|
|
|
- packet.CheckCreated();
|
|
|
+ public void Flush() {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- if (peers.Length > 0)
|
|
|
- {
|
|
|
- IntPtr[] nativePeers = ArrayPool.GetPointerBuffer();
|
|
|
- int nativeCount = 0;
|
|
|
-
|
|
|
- for (int i = 0; i < peers.Length; i++)
|
|
|
- {
|
|
|
- if (peers[i].NativeData != IntPtr.Zero)
|
|
|
- {
|
|
|
- nativePeers[nativeCount] = peers[i].NativeData;
|
|
|
- nativeCount++;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- Native.enet_host_broadcast_selective(nativeHost, channelID, packet.NativeData, nativePeers, (IntPtr)nativeCount);
|
|
|
- }
|
|
|
+ Native.enet_host_flush(nativeHost);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- packet.NativeData = IntPtr.Zero;
|
|
|
- }
|
|
|
+ public struct Peer {
|
|
|
+ private IntPtr nativePeer;
|
|
|
+ private uint nativeID;
|
|
|
|
|
|
- public int CheckEvents(out Event @event)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ internal IntPtr NativeData {
|
|
|
+ get {
|
|
|
+ return nativePeer;
|
|
|
+ }
|
|
|
|
|
|
+ set {
|
|
|
+ nativePeer = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- int result = Native.enet_host_check_events(nativeHost, out ENetEvent nativeEvent);
|
|
|
+ internal Peer(IntPtr peer) {
|
|
|
+ nativePeer = peer;
|
|
|
+ nativeID = nativePeer != IntPtr.Zero ? Native.enet_peer_get_id(nativePeer) : 0;
|
|
|
+ }
|
|
|
|
|
|
- if (result <= 0)
|
|
|
- {
|
|
|
- @event = default;
|
|
|
+ public bool IsSet {
|
|
|
+ get {
|
|
|
+ return nativePeer != IntPtr.Zero;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- return result;
|
|
|
- }
|
|
|
+ public uint ID {
|
|
|
+ get {
|
|
|
+ return nativeID;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- @event = new Event(nativeEvent);
|
|
|
+ public string IP {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return result;
|
|
|
- }
|
|
|
+ byte[] ip = ArrayPool.GetByteBuffer();
|
|
|
|
|
|
- public Peer Connect(Address address)
|
|
|
- {
|
|
|
- return Connect(address, 0, 0);
|
|
|
- }
|
|
|
+ if (Native.enet_peer_get_ip(nativePeer, ip, (IntPtr)ip.Length) == 0)
|
|
|
+ return Encoding.ASCII.GetString(ip, 0, ip.StringLength());
|
|
|
+ else
|
|
|
+ return String.Empty;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public Peer Connect(Address address, int channelLimit)
|
|
|
- {
|
|
|
- return Connect(address, channelLimit, 0);
|
|
|
- }
|
|
|
+ public ushort Port {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- public Peer Connect(Address address, int channelLimit, uint data)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
- CheckChannelLimit(channelLimit);
|
|
|
+ return Native.enet_peer_get_port(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- ENetAddress nativeAddress = address.NativeData;
|
|
|
- Peer peer = new Peer(Native.enet_host_connect(nativeHost, ref nativeAddress, (IntPtr)channelLimit, data));
|
|
|
+ public uint MTU {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- if (peer.NativeData == IntPtr.Zero)
|
|
|
- throw new InvalidOperationException("Host connect call failed");
|
|
|
+ return Native.enet_peer_get_mtu(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- return peer;
|
|
|
- }
|
|
|
+ public PeerState State {
|
|
|
+ get {
|
|
|
+ return nativePeer == IntPtr.Zero ? PeerState.Uninitialized : Native.enet_peer_get_state(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public int Service(int timeout, out Event @event)
|
|
|
- {
|
|
|
- if (timeout < 0)
|
|
|
- throw new ArgumentOutOfRangeException("timeout");
|
|
|
+ public uint RoundTripTime {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- CheckCreated();
|
|
|
+ return Native.enet_peer_get_rtt(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ public uint LastRoundTripTime {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- int result = Native.enet_host_service(nativeHost, out ENetEvent nativeEvent, (uint)timeout);
|
|
|
+ return Native.enet_peer_get_last_rtt(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (result <= 0)
|
|
|
- {
|
|
|
- @event = default;
|
|
|
+ public uint LastSendTime {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return result;
|
|
|
- }
|
|
|
+ return Native.enet_peer_get_lastsendtime(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- @event = new Event(nativeEvent);
|
|
|
+ public uint LastReceiveTime {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return result;
|
|
|
- }
|
|
|
+ return Native.enet_peer_get_lastreceivetime(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public void SetBandwidthLimit(uint incomingBandwidth, uint outgoingBandwidth)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ public ulong PacketsSent {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- Native.enet_host_bandwidth_limit(nativeHost, incomingBandwidth, outgoingBandwidth);
|
|
|
- }
|
|
|
+ return Native.enet_peer_get_packets_sent(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public void SetChannelLimit(int channelLimit)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
- CheckChannelLimit(channelLimit);
|
|
|
+ public ulong PacketsLost {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- Native.enet_host_channel_limit(nativeHost, (IntPtr)channelLimit);
|
|
|
- }
|
|
|
+ return Native.enet_peer_get_packets_lost(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public void Flush()
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ public ulong BytesSent {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- Native.enet_host_flush(nativeHost);
|
|
|
- }
|
|
|
- }
|
|
|
+ return Native.enet_peer_get_bytes_sent(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public struct Peer
|
|
|
- {
|
|
|
- private IntPtr nativePeer;
|
|
|
- private readonly uint nativeID;
|
|
|
+ public ulong BytesReceived {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- internal IntPtr NativeData {
|
|
|
- get {
|
|
|
- return nativePeer;
|
|
|
- }
|
|
|
+ return Native.enet_peer_get_bytes_received(nativePeer);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- set {
|
|
|
- nativePeer = value;
|
|
|
- }
|
|
|
- }
|
|
|
+ public IntPtr Data {
|
|
|
+ get {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- internal Peer(IntPtr peer)
|
|
|
- {
|
|
|
- nativePeer = peer;
|
|
|
- nativeID = nativePeer != IntPtr.Zero ? Native.enet_peer_get_id(nativePeer) : 0;
|
|
|
- }
|
|
|
+ return Native.enet_peer_get_data(nativePeer);
|
|
|
+ }
|
|
|
|
|
|
- public bool IsSet {
|
|
|
- get {
|
|
|
- return nativePeer != IntPtr.Zero;
|
|
|
- }
|
|
|
- }
|
|
|
+ set {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- public uint ID {
|
|
|
- get {
|
|
|
- return nativeID;
|
|
|
- }
|
|
|
- }
|
|
|
+ Native.enet_peer_set_data(nativePeer, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public string IP {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ internal void IsCreated() {
|
|
|
+ if (nativePeer == IntPtr.Zero)
|
|
|
+ throw new InvalidOperationException("Peer not created");
|
|
|
+ }
|
|
|
|
|
|
- byte[] ip = ArrayPool.GetByteBuffer();
|
|
|
+ public void ConfigureThrottle(uint interval, uint acceleration, uint deceleration, uint threshold) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- if (Native.enet_peer_get_ip(nativePeer, ip, (IntPtr)ip.Length) == 0)
|
|
|
- return Encoding.ASCII.GetString(ip, 0, ip.StringLength());
|
|
|
- else
|
|
|
- return String.Empty;
|
|
|
- }
|
|
|
- }
|
|
|
+ Native.enet_peer_throttle_configure(nativePeer, interval, acceleration, deceleration, threshold);
|
|
|
+ }
|
|
|
|
|
|
- public ushort Port {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ public bool Send(byte channelID, ref Packet packet) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return Native.enet_peer_get_port(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ packet.IsCreated();
|
|
|
|
|
|
- public uint MTU {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ return Native.enet_peer_send(nativePeer, channelID, packet.NativeData) == 0;
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_peer_get_mtu(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ public bool Receive(out byte channelID, out Packet packet) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- public PeerState State {
|
|
|
- get {
|
|
|
- return nativePeer == IntPtr.Zero ? PeerState.Uninitialized : Native.enet_peer_get_state(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ IntPtr nativePacket = Native.enet_peer_receive(nativePeer, out channelID);
|
|
|
|
|
|
- public uint RoundTripTime {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ if (nativePacket != IntPtr.Zero) {
|
|
|
+ packet = new Packet(nativePacket);
|
|
|
|
|
|
- return Native.enet_peer_get_rtt(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
|
|
|
- public uint LastSendTime {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ packet = default;
|
|
|
|
|
|
- return Native.enet_peer_get_lastsendtime(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
- public uint LastReceiveTime {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ public void Ping() {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return Native.enet_peer_get_lastreceivetime(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ Native.enet_peer_ping(nativePeer);
|
|
|
+ }
|
|
|
|
|
|
- public ulong PacketsSent {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ public void PingInterval(uint interval) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return Native.enet_peer_get_packets_sent(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ Native.enet_peer_ping_interval(nativePeer, interval);
|
|
|
+ }
|
|
|
|
|
|
- public ulong PacketsLost {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ public void Timeout(uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return Native.enet_peer_get_packets_lost(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ Native.enet_peer_timeout(nativePeer, timeoutLimit, timeoutMinimum, timeoutMaximum);
|
|
|
+ }
|
|
|
|
|
|
- public ulong BytesSent {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ public void Disconnect(uint data) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return Native.enet_peer_get_bytes_sent(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ Native.enet_peer_disconnect(nativePeer, data);
|
|
|
+ }
|
|
|
|
|
|
- public ulong BytesReceived {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ public void DisconnectNow(uint data) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return Native.enet_peer_get_bytes_received(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
+ Native.enet_peer_disconnect_now(nativePeer, data);
|
|
|
+ }
|
|
|
|
|
|
- public IntPtr Data {
|
|
|
- get {
|
|
|
- CheckCreated();
|
|
|
+ public void DisconnectLater(uint data) {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- return Native.enet_peer_get_data(nativePeer);
|
|
|
- }
|
|
|
+ Native.enet_peer_disconnect_later(nativePeer, data);
|
|
|
+ }
|
|
|
|
|
|
- set {
|
|
|
- CheckCreated();
|
|
|
+ public void Reset() {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- Native.enet_peer_set_data(nativePeer, value);
|
|
|
- }
|
|
|
- }
|
|
|
+ Native.enet_peer_reset(nativePeer);
|
|
|
+ }
|
|
|
|
|
|
- internal void CheckCreated()
|
|
|
- {
|
|
|
- if (nativePeer == IntPtr.Zero)
|
|
|
- throw new InvalidOperationException("Peer not created");
|
|
|
- }
|
|
|
+ // == ADDITIONS NOT AVAILABLE IN UPSTREAM REPOSITORY == //
|
|
|
+ // These are placed here to ensure that merge conflicts aren't a
|
|
|
+ // pain in the ass.
|
|
|
|
|
|
- public void ConfigureThrottle(uint interval, uint acceleration, uint deceleration, uint threshold)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ // SendAndReturnStatusCode returns either 0 if the send was successful,
|
|
|
+ // or the ENET return code if not. Sometimes a bool is not enough to determine
|
|
|
+ // the root cause of a issue.
|
|
|
+ public int SendAndReturnStatusCode(byte channelID, ref Packet packet)
|
|
|
+ {
|
|
|
+ IsCreated();
|
|
|
|
|
|
- Native.enet_peer_throttle_configure(nativePeer, interval, acceleration, deceleration, threshold);
|
|
|
- }
|
|
|
+ packet.IsCreated();
|
|
|
|
|
|
- public bool Send(byte channelID, ref Packet packet)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ return Native.enet_peer_send(nativePeer, channelID, packet.NativeData);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- packet.CheckCreated();
|
|
|
+ public static class Extensions {
|
|
|
+ public static int StringLength(this byte[] data) {
|
|
|
+ if (data == null)
|
|
|
+ throw new ArgumentNullException("data");
|
|
|
|
|
|
- return Native.enet_peer_send(nativePeer, channelID, packet.NativeData) == 0;
|
|
|
- }
|
|
|
+ int i;
|
|
|
|
|
|
- // Added by Coburn. This version returns either 0 if the send was successful,
|
|
|
- // or the ENET return code if not. Sometimes a bool is not enough to determine
|
|
|
- // the root cause of the issue.
|
|
|
- public int SendAndReturnStatusCode(byte channelID, ref Packet packet)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ for (i = 0; i < data.Length && data[i] != 0; i++);
|
|
|
|
|
|
- packet.CheckCreated();
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- return Native.enet_peer_send(nativePeer, channelID, packet.NativeData);
|
|
|
- }
|
|
|
+ public static class Library {
|
|
|
+ public const uint maxChannelCount = 0xFF;
|
|
|
+ public const uint maxPeers = 0xFFF;
|
|
|
+ public const uint maxPacketSize = 32 * 1024 * 1024;
|
|
|
+ public const uint throttleThreshold = 20;
|
|
|
+ public const uint throttleScale = 32;
|
|
|
+ public const uint throttleAcceleration = 2;
|
|
|
+ public const uint throttleDeceleration = 2;
|
|
|
+ public const uint throttleInterval = 5000;
|
|
|
+ public const uint timeoutLimit = 32;
|
|
|
+ public const uint timeoutMinimum = 5000;
|
|
|
+ public const uint timeoutMaximum = 30000;
|
|
|
+
|
|
|
+ // Lock our version to 2.4.0, to avoid confusion with upstream.
|
|
|
+ public const uint version = (2 << 16) | (4 << 8) | (0);
|
|
|
|
|
|
+ public static bool Initialize() {
|
|
|
+ return Native.enet_initialize() == 0;
|
|
|
+ }
|
|
|
|
|
|
- public bool Receive(out byte channelID, out Packet packet)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
+ public static bool Initialize(Callbacks callbacks) {
|
|
|
+ ENetCallbacks nativeCallbacks = callbacks.NativeData;
|
|
|
|
|
|
- IntPtr nativePacket = Native.enet_peer_receive(nativePeer, out channelID);
|
|
|
+ return Native.enet_initialize_with_callbacks(version, ref nativeCallbacks) == 0;
|
|
|
+ }
|
|
|
|
|
|
- if (nativePacket != IntPtr.Zero)
|
|
|
- {
|
|
|
- packet = new Packet(nativePacket);
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
+ public static void Deinitialize() {
|
|
|
+ Native.enet_deinitialize();
|
|
|
+ }
|
|
|
|
|
|
- packet = default;
|
|
|
+ public static uint Time {
|
|
|
+ get {
|
|
|
+ return Native.enet_time_get();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- public void Ping()
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
-
|
|
|
- Native.enet_peer_ping(nativePeer);
|
|
|
- }
|
|
|
-
|
|
|
- public void PingInterval(uint interval)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
-
|
|
|
- Native.enet_peer_ping_interval(nativePeer, interval);
|
|
|
- }
|
|
|
-
|
|
|
- public void Timeout(uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
-
|
|
|
- Native.enet_peer_timeout(nativePeer, timeoutLimit, timeoutMinimum, timeoutMaximum);
|
|
|
- }
|
|
|
-
|
|
|
- public void Disconnect(uint data)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
-
|
|
|
- Native.enet_peer_disconnect(nativePeer, data);
|
|
|
- }
|
|
|
-
|
|
|
- public void DisconnectNow(uint data)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
-
|
|
|
- Native.enet_peer_disconnect_now(nativePeer, data);
|
|
|
- }
|
|
|
-
|
|
|
- public void DisconnectLater(uint data)
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
-
|
|
|
- Native.enet_peer_disconnect_later(nativePeer, data);
|
|
|
- }
|
|
|
-
|
|
|
- public void Reset()
|
|
|
- {
|
|
|
- CheckCreated();
|
|
|
-
|
|
|
- Native.enet_peer_reset(nativePeer);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public static class Extensions
|
|
|
- {
|
|
|
- public static int StringLength(this byte[] data)
|
|
|
- {
|
|
|
- if (data == null)
|
|
|
- throw new ArgumentNullException("data");
|
|
|
-
|
|
|
- int i;
|
|
|
-
|
|
|
- for (i = 0; i < data.Length && data[i] != 0; i++) ;
|
|
|
-
|
|
|
- return i;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public static class Library
|
|
|
- {
|
|
|
- public const uint maxChannelCount = 0xFF;
|
|
|
- public const uint maxPeers = 0xFFF;
|
|
|
- public const uint maxPacketSize = 32 * 1024 * 1024;
|
|
|
- public const uint throttleThreshold = 20; // Reasonable threshold to help reduce throttling.
|
|
|
- public const uint throttleScale = 32;
|
|
|
- public const uint throttleAcceleration = 2;
|
|
|
- public const uint throttleDeceleration = 2;
|
|
|
- public const uint throttleInterval = 5000;
|
|
|
- public const uint timeoutLimit = 32;
|
|
|
- public const uint timeoutMinimum = 5000;
|
|
|
- public const uint timeoutMaximum = 30000;
|
|
|
-
|
|
|
- public const uint version = (2 << 16) | (4 << 8) | (0);
|
|
|
-
|
|
|
- public static bool Initialize()
|
|
|
- {
|
|
|
- return Native.enet_initialize() == 0;
|
|
|
- }
|
|
|
-
|
|
|
- public static bool Initialize(Callbacks inits)
|
|
|
- {
|
|
|
- return Native.enet_initialize_with_callbacks(version, inits.NativeData) == 0;
|
|
|
- }
|
|
|
-
|
|
|
- public static void Deinitialize()
|
|
|
- {
|
|
|
- Native.enet_deinitialize();
|
|
|
- }
|
|
|
-
|
|
|
- public static uint Time {
|
|
|
- get {
|
|
|
- return Native.enet_time_get();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- [SuppressUnmanagedCodeSecurity]
|
|
|
- internal static class Native
|
|
|
- {
|
|
|
+ [SuppressUnmanagedCodeSecurity]
|
|
|
+ internal static class Native {
|
|
|
#if __IOS__ || UNITY_IOS && !UNITY_EDITOR
|
|
|
- // iOS
|
|
|
+ // We're building for a certain mobile fruity OS.
|
|
|
private const string nativeLibrary = "__Internal";
|
|
|
#elif __APPLE__ || UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
|
|
|
- // MacOS
|
|
|
- // Custom ENet Repo builds as libenet.bundle; make sure it's the same.
|
|
|
+ // We're building for a certain fruity OS.
|
|
|
private const string nativeLibrary = "libenet";
|
|
|
#else
|
|
|
- // Assume everything else, Windows et al...
|
|
|
- // This might be interesting if someone's building for Nintendo Switch or whatnot...
|
|
|
+ // Assume everything else, Windows et al...
|
|
|
private const string nativeLibrary = "enet";
|
|
|
-#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_initialize();
|
|
|
+
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_initialize_with_callbacks(uint version, ref ENetCallbacks inits);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern int enet_initialize();
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_deinitialize();
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern int enet_initialize_with_callbacks(uint version, ENetCallbacks inits);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_time_get();
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_deinitialize();
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_address_set_ip(ref ENetAddress address, string ip);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_time_get();
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_address_set_hostname(ref ENetAddress address, string hostName);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
|
|
|
- internal static extern int enet_address_set_host_ip(ref ENetAddress address, string ip);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_address_get_ip(ref ENetAddress address, StringBuilder ip, IntPtr ipLength);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
|
|
|
- internal static extern int enet_address_set_host(ref ENetAddress address, string hostName);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_address_get_hostname(ref ENetAddress address, StringBuilder hostName, IntPtr nameLength);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
|
|
|
- internal static extern int enet_address_get_host_ip(ENetAddress address, StringBuilder ip, IntPtr ipLength);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_packet_create(byte[] data, IntPtr dataLength, PacketFlags flags);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
|
|
|
- internal static extern int enet_address_get_host(ENetAddress address, StringBuilder hostName, IntPtr nameLength);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_packet_create(IntPtr data, IntPtr dataLength, PacketFlags flags);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_packet_create(byte[] data, IntPtr dataLength, PacketFlags flags);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_packet_create_offset(byte[] data, IntPtr dataLength, IntPtr dataOffset, PacketFlags flags);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_packet_create(IntPtr data, IntPtr dataLength, PacketFlags flags);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_packet_create_offset(IntPtr data, IntPtr dataLength, IntPtr dataOffset, PacketFlags flags);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_packet_create_offset(byte[] data, IntPtr dataLength, IntPtr dataOffset, PacketFlags flags);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_packet_check_references(IntPtr packet);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_packet_create_offset(IntPtr data, IntPtr dataLength, IntPtr dataOffset, PacketFlags flags);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_packet_get_data(IntPtr packet);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern int enet_packet_check_references(IntPtr packet);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_packet_get_user_data(IntPtr packet);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_packet_get_data(IntPtr packet);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_packet_set_user_data(IntPtr packet, IntPtr userData);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern int enet_packet_get_length(IntPtr packet);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_packet_get_length(IntPtr packet);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_packet_set_free_callback(IntPtr packet, IntPtr callback);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_packet_set_free_callback(IntPtr packet, IntPtr callback);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_packet_dispose(IntPtr packet);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_packet_dispose(IntPtr packet);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_host_create(ref ENetAddress address, IntPtr peerLimit, IntPtr channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_host_create(ref ENetAddress address, IntPtr peerLimit, IntPtr channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_host_create(IntPtr address, IntPtr peerLimit, IntPtr channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_host_create(IntPtr address, IntPtr peerLimit, IntPtr channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_host_connect(IntPtr host, ref ENetAddress address, IntPtr channelCount, uint data);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_host_connect(IntPtr host, ref ENetAddress address, IntPtr channelCount, uint data);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_host_broadcast(IntPtr host, byte channelID, IntPtr packet);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_host_broadcast(IntPtr host, byte channelID, IntPtr packet);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_host_broadcast_exclude(IntPtr host, byte channelID, IntPtr packet, IntPtr excludedPeer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_host_broadcast_exclude(IntPtr host, byte channelID, IntPtr packet, IntPtr excludedPeer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_host_broadcast_selective(IntPtr host, byte channelID, IntPtr packet, IntPtr[] peers, IntPtr peersLength);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_host_broadcast_selective(IntPtr host, byte channelID, IntPtr packet, IntPtr[] peers, IntPtr peersLength);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern int enet_host_service(IntPtr host, out ENetEvent @event, uint timeout);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_host_service(IntPtr host, out ENetEvent @event, uint timeout);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern int enet_host_check_events(IntPtr host, out ENetEvent @event);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_host_check_events(IntPtr host, out ENetEvent @event);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_host_channel_limit(IntPtr host, IntPtr channelLimit);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_host_channel_limit(IntPtr host, IntPtr channelLimit);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_host_bandwidth_limit(IntPtr host, uint incomingBandwidth, uint outgoingBandwidth);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_host_bandwidth_limit(IntPtr host, uint incomingBandwidth, uint outgoingBandwidth);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_host_get_peers_count(IntPtr host);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_host_get_peers_count(IntPtr host);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_host_get_packets_sent(IntPtr host);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_host_get_packets_sent(IntPtr host);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_host_get_packets_received(IntPtr host);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_host_get_packets_received(IntPtr host);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_host_get_bytes_sent(IntPtr host);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_host_get_bytes_sent(IntPtr host);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_host_get_bytes_received(IntPtr host);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_host_get_bytes_received(IntPtr host);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_host_flush(IntPtr host);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_host_flush(IntPtr host);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_host_destroy(IntPtr host);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_host_destroy(IntPtr host);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_host_enable_compression(IntPtr host);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_host_prevent_connections(IntPtr host, byte state);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_host_prevent_connections(IntPtr host, byte state);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_peer_throttle_configure(IntPtr peer, uint interval, uint acceleration, uint deceleration, uint threshold);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_peer_throttle_configure(IntPtr peer, uint interval, uint acceleration, uint deceleration, uint threshold);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_peer_get_id(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_peer_get_id(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_peer_get_ip(IntPtr peer, byte[] ip, IntPtr ipLength);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern int enet_peer_get_ip(IntPtr peer, byte[] ip, IntPtr ipLength);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern ushort enet_peer_get_port(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern ushort enet_peer_get_port(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_peer_get_mtu(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_peer_get_mtu(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern PeerState enet_peer_get_state(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern PeerState enet_peer_get_state(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_peer_get_rtt(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_peer_get_rtt(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_peer_get_last_rtt(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_peer_get_lastsendtime(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_peer_get_lastsendtime(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern uint enet_peer_get_lastreceivetime(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern uint enet_peer_get_lastreceivetime(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern ulong enet_peer_get_packets_sent(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern ulong enet_peer_get_packets_sent(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern ulong enet_peer_get_packets_lost(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern ulong enet_peer_get_packets_lost(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern ulong enet_peer_get_bytes_sent(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern ulong enet_peer_get_bytes_sent(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern ulong enet_peer_get_bytes_received(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern ulong enet_peer_get_bytes_received(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_peer_get_data(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_peer_get_data(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_peer_set_data(IntPtr peer, IntPtr data);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_peer_set_data(IntPtr peer, IntPtr data);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern int enet_peer_send(IntPtr peer, byte channelID, IntPtr packet);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern int enet_peer_send(IntPtr peer, byte channelID, IntPtr packet);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern IntPtr enet_peer_receive(IntPtr peer, out byte channelID);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern IntPtr enet_peer_receive(IntPtr peer, out byte channelID);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_peer_ping(IntPtr peer);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_peer_ping(IntPtr peer);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_peer_ping_interval(IntPtr peer, uint pingInterval);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_peer_ping_interval(IntPtr peer, uint pingInterval);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_peer_timeout(IntPtr peer, uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_peer_timeout(IntPtr peer, uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_peer_disconnect(IntPtr peer, uint data);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_peer_disconnect(IntPtr peer, uint data);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_peer_disconnect_now(IntPtr peer, uint data);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_peer_disconnect_now(IntPtr peer, uint data);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_peer_disconnect_later(IntPtr peer, uint data);
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_peer_disconnect_later(IntPtr peer, uint data);
|
|
|
|
|
|
- [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
- internal static extern void enet_peer_reset(IntPtr peer);
|
|
|
- }
|
|
|
+ [DllImport(nativeLibrary, CallingConvention = CallingConvention.Cdecl)]
|
|
|
+ internal static extern void enet_peer_reset(IntPtr peer);
|
|
|
+ }
|
|
|
}
|