Peer.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Threading.Tasks;
  4. namespace ENet
  5. {
  6. public class Peer : IDisposable
  7. {
  8. private static readonly PeerEventsManager peerEventsManager = new PeerEventsManager();
  9. public static PeerEventsManager PeerEventsManager
  10. {
  11. get
  12. {
  13. return peerEventsManager;
  14. }
  15. }
  16. private IntPtr peer;
  17. public Peer(IntPtr peer)
  18. {
  19. if (peer == IntPtr.Zero)
  20. {
  21. throw new InvalidOperationException("No native peer.");
  22. }
  23. this.peer = peer;
  24. PeerEventsManager.Add(peer);
  25. }
  26. ~Peer()
  27. {
  28. this.Dispose(false);
  29. }
  30. public void Dispose()
  31. {
  32. Dispose(true);
  33. GC.SuppressFinalize(this);
  34. }
  35. protected void Dispose(bool disposing)
  36. {
  37. if (this.peer == IntPtr.Zero)
  38. {
  39. return;
  40. }
  41. PeerEventsManager.Remove(this.peer);
  42. Native.enet_peer_reset(this.peer);
  43. this.peer = IntPtr.Zero;
  44. }
  45. public ENetPeer Struct
  46. {
  47. get
  48. {
  49. return (ENetPeer)Marshal.PtrToStructure(this.peer, typeof(ENetPeer));
  50. }
  51. set
  52. {
  53. Marshal.StructureToPtr(value, this.peer, false);
  54. }
  55. }
  56. public IntPtr NativePtr
  57. {
  58. get
  59. {
  60. return this.peer;
  61. }
  62. }
  63. public PeerState State
  64. {
  65. get
  66. {
  67. return Struct.state;
  68. }
  69. }
  70. public void ConfigureThrottle(uint interval, uint acceleration, uint deceleration)
  71. {
  72. Native.enet_peer_throttle_configure(this.peer, interval, acceleration, deceleration);
  73. }
  74. public void Send(byte channelID, string data)
  75. {
  76. using (var packet = new Packet(data))
  77. {
  78. this.Send(channelID, packet);
  79. }
  80. }
  81. public void Send(byte channelID, Packet packet)
  82. {
  83. Native.enet_peer_send(this.peer, channelID, packet.NativePtr);
  84. }
  85. public Task<Packet> ReceiveAsync()
  86. {
  87. var tcs = new TaskCompletionSource<Packet>();
  88. PeerEventsManager[this.peer].Received += e => tcs.TrySetResult(e.Packet);
  89. return tcs.Task;
  90. }
  91. public Task<bool> DisconnectAsync(uint data)
  92. {
  93. var tcs = new TaskCompletionSource<bool>();
  94. PeerEventsManager[this.peer].Disconnect += e => tcs.TrySetResult(true);
  95. Native.enet_peer_disconnect(this.peer, data);
  96. return tcs.Task;
  97. }
  98. public Task<bool> DisconnectLaterAsync(uint data)
  99. {
  100. var tcs = new TaskCompletionSource<bool>();
  101. PeerEventsManager[this.peer].Disconnect += e => tcs.TrySetResult(true);
  102. Native.enet_peer_disconnect_later(this.peer, data);
  103. return tcs.Task;
  104. }
  105. public void DisconnectNow(uint data)
  106. {
  107. Native.enet_peer_disconnect_now(this.peer, data);
  108. }
  109. public void Ping()
  110. {
  111. Native.enet_peer_ping(this.peer);
  112. }
  113. }
  114. }