Peer.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Threading.Tasks;
  4. using Log;
  5. namespace ENet
  6. {
  7. public sealed class Peer: IDisposable
  8. {
  9. private readonly PeerEvent peerEvent = new PeerEvent();
  10. private IntPtr peerPtr;
  11. public Peer(IntPtr peerPtr)
  12. {
  13. this.peerPtr = peerPtr;
  14. }
  15. ~Peer()
  16. {
  17. this.Dispose(false);
  18. }
  19. public void Dispose()
  20. {
  21. this.Dispose(true);
  22. GC.SuppressFinalize(this);
  23. }
  24. private void Dispose(bool disposing)
  25. {
  26. if (this.peerPtr == IntPtr.Zero)
  27. {
  28. return;
  29. }
  30. NativeMethods.enet_peer_reset(this.peerPtr);
  31. this.peerPtr = IntPtr.Zero;
  32. }
  33. public IntPtr PeerPtr
  34. {
  35. get
  36. {
  37. return this.peerPtr;
  38. }
  39. set
  40. {
  41. this.peerPtr = value;
  42. }
  43. }
  44. private ENetPeer Struct
  45. {
  46. get
  47. {
  48. if (this.peerPtr == IntPtr.Zero)
  49. {
  50. return new ENetPeer();
  51. }
  52. return (ENetPeer) Marshal.PtrToStructure(this.peerPtr, typeof (ENetPeer));
  53. }
  54. set
  55. {
  56. Marshal.StructureToPtr(value, this.peerPtr, false);
  57. }
  58. }
  59. public PeerEvent PeerEvent
  60. {
  61. get
  62. {
  63. return this.peerEvent;
  64. }
  65. }
  66. public PeerState State
  67. {
  68. get
  69. {
  70. if (this.peerPtr == IntPtr.Zero)
  71. {
  72. return PeerState.Uninitialized;
  73. }
  74. return this.Struct.state;
  75. }
  76. }
  77. public void Ping()
  78. {
  79. NativeMethods.enet_peer_ping(this.peerPtr);
  80. }
  81. public void ConfigureThrottle(uint interval, uint acceleration, uint deceleration)
  82. {
  83. NativeMethods.enet_peer_throttle_configure(this.peerPtr, interval, acceleration, deceleration);
  84. }
  85. public void Send(byte channelID, byte[] data)
  86. {
  87. var packet = new Packet(data);
  88. this.Send(channelID, packet);
  89. }
  90. public void Send(byte channelID, Packet packet)
  91. {
  92. NativeMethods.enet_peer_send(this.peerPtr, channelID, packet.PacketPtr);
  93. // enet_peer_send函数会自动删除packet,设置为0,防止Dispose或者析构函数再次删除
  94. packet.PacketPtr = IntPtr.Zero;
  95. }
  96. public Task<Packet> ReceiveAsync()
  97. {
  98. var tcs = new TaskCompletionSource<Packet>();
  99. this.PeerEvent.Received += e =>
  100. {
  101. if (e.EventState == EventState.DISCONNECTED)
  102. {
  103. tcs.TrySetException(new ENetException(3, "Peer Disconnected In Received"));
  104. }
  105. var packet = new Packet(e.PacketPtr);
  106. tcs.TrySetResult(packet);
  107. };
  108. return tcs.Task;
  109. }
  110. public Task<bool> DisconnectAsync(uint data = 0)
  111. {
  112. NativeMethods.enet_peer_disconnect(this.peerPtr, data);
  113. var tcs = new TaskCompletionSource<bool>();
  114. this.PeerEvent.Disconnect += e => tcs.TrySetResult(true);
  115. return tcs.Task;
  116. }
  117. public Task<bool> DisconnectLaterAsync(uint data = 0)
  118. {
  119. NativeMethods.enet_peer_disconnect_later(this.peerPtr, data);
  120. var tcs = new TaskCompletionSource<bool>();
  121. this.PeerEvent.Disconnect += e => tcs.TrySetResult(true);
  122. return tcs.Task;
  123. }
  124. public void DisconnectNow(uint data)
  125. {
  126. NativeMethods.enet_peer_disconnect_now(this.peerPtr, data);
  127. }
  128. }
  129. }