ServerHost.cs 2.7 KB

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