ServerHost.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using System.Threading.Tasks;
  3. using Log;
  4. namespace ENet
  5. {
  6. public sealed class ServerHost : Host
  7. {
  8. private Action<Peer> acceptEvent;
  9. public ServerHost(Address address,
  10. uint peerLimit = NativeMethods.ENET_PROTOCOL_MAXIMUM_PEER_ID,
  11. uint channelLimit = 0, uint incomingBandwidth = 0,
  12. uint outgoingBandwidth = 0, bool enableCrc = true)
  13. {
  14. if (peerLimit > NativeMethods.ENET_PROTOCOL_MAXIMUM_PEER_ID)
  15. {
  16. throw new ArgumentOutOfRangeException("peerLimit");
  17. }
  18. CheckChannelLimit(channelLimit);
  19. ENetAddress nativeAddress = address.Struct;
  20. this.host = NativeMethods.enet_host_create(
  21. ref nativeAddress, peerLimit,
  22. channelLimit, incomingBandwidth, outgoingBandwidth);
  23. if (this.host == IntPtr.Zero)
  24. {
  25. throw new ENetException(0, "Host creation call failed.");
  26. }
  27. if (enableCrc)
  28. {
  29. NativeMethods.enet_enable_crc(this.host);
  30. }
  31. }
  32. public Action<Peer> AcceptEvent
  33. {
  34. set
  35. {
  36. this.acceptEvent = value;
  37. }
  38. }
  39. public void RunOnce(int timeout = 0)
  40. {
  41. this.OnEvents();
  42. if (this.Service(timeout) < 0)
  43. {
  44. return;
  45. }
  46. Event ev;
  47. while (this.CheckEvents(out ev) > 0)
  48. {
  49. switch (ev.Type)
  50. {
  51. case EventType.Connect:
  52. {
  53. if (this.acceptEvent == null)
  54. {
  55. throw new ENetException(4, "No Accept Event!");
  56. }
  57. var peer = new Peer(ev.PeerPtr);
  58. this.PeersManager.Add(peer.PeerPtr, peer);
  59. this.acceptEvent(peer);
  60. break;
  61. }
  62. case EventType.Receive:
  63. {
  64. var peer = this.PeersManager[ev.PeerPtr];
  65. peer.PeerEvent.OnReceived(ev);
  66. peer.PeerEvent.Received = null;
  67. break;
  68. }
  69. case EventType.Disconnect:
  70. {
  71. ev.EventState = EventState.DISCONNECTED;
  72. var peer = this.PeersManager[ev.PeerPtr];
  73. PeerEvent peerEvent = peer.PeerEvent;
  74. this.PeersManager.Remove(ev.PeerPtr);
  75. // enet_peer_disconnect会reset Peer,这里设置为0,防止再次Dispose
  76. peer.PeerPtr = IntPtr.Zero;
  77. if (peerEvent.Received != null)
  78. {
  79. peerEvent.OnReceived(ev);
  80. }
  81. else
  82. {
  83. peerEvent.OnDisconnect(ev);
  84. }
  85. break;
  86. }
  87. }
  88. }
  89. }
  90. public void Start(int timeout = 0)
  91. {
  92. while (isRunning)
  93. {
  94. RunOnce(timeout);
  95. }
  96. }
  97. }
  98. }