Peer.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. this.peer = peer;
  20. PeerEventsManager.Add(peer);
  21. }
  22. ~Peer()
  23. {
  24. this.Dispose(false);
  25. }
  26. public void Dispose()
  27. {
  28. Dispose(true);
  29. GC.SuppressFinalize(this);
  30. }
  31. protected void Dispose(bool disposing)
  32. {
  33. if (this.peer == IntPtr.Zero)
  34. {
  35. return;
  36. }
  37. PeerEventsManager.Remove(this.peer);
  38. Native.enet_peer_reset(this.peer);
  39. this.peer = IntPtr.Zero;
  40. }
  41. public ENetPeer Struct
  42. {
  43. get
  44. {
  45. if (this.peer == IntPtr.Zero)
  46. {
  47. return new ENetPeer();
  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. if (this.peer == IntPtr.Zero)
  68. {
  69. return PeerState.Uninitialized;
  70. }
  71. return Struct.state;
  72. }
  73. }
  74. public void Ping()
  75. {
  76. Native.enet_peer_ping(this.peer);
  77. }
  78. public void ConfigureThrottle(uint interval, uint acceleration, uint deceleration)
  79. {
  80. Native.enet_peer_throttle_configure(this.peer, interval, acceleration, deceleration);
  81. }
  82. public void Send(byte channelID, string data)
  83. {
  84. using (var packet = new Packet(data))
  85. {
  86. this.Send(channelID, packet);
  87. }
  88. }
  89. public void Send(byte channelID, Packet packet)
  90. {
  91. Native.enet_peer_send(this.peer, channelID, packet.NativePtr);
  92. }
  93. public Task<Packet> ReceiveAsync()
  94. {
  95. var tcs = new TaskCompletionSource<Packet>();
  96. PeerEventsManager[this.peer].Received += e => tcs.TrySetResult(e.Packet);
  97. return tcs.Task;
  98. }
  99. public Task<bool> DisconnectAsync(uint data)
  100. {
  101. var tcs = new TaskCompletionSource<bool>();
  102. PeerEventsManager[this.peer].Disconnect += e => tcs.TrySetResult(true);
  103. Native.enet_peer_disconnect(this.peer, data);
  104. return tcs.Task;
  105. }
  106. public Task<bool> DisconnectLaterAsync(uint data)
  107. {
  108. var tcs = new TaskCompletionSource<bool>();
  109. PeerEventsManager[this.peer].Disconnect += e => tcs.TrySetResult(true);
  110. Native.enet_peer_disconnect_later(this.peer, data);
  111. return tcs.Task;
  112. }
  113. public void DisconnectNow(uint data)
  114. {
  115. Native.enet_peer_disconnect_now(this.peer, data);
  116. }
  117. }
  118. }