Peer.cs 2.7 KB

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