public void Dispose() { if (IsCreated) { var connections = m_Connections.GetValueArray(Allocator.Temp); foreach (var con in connections) { con.Dispose(); } m_Host.Flush(); } m_Host.Dispose(true); m_PacketsToSend.Dispose(); m_PacketsChannelToUse.Dispose(); m_ConnectionVersions.Dispose(); m_QueuedForDisconnection.Dispose(); m_Connections.Dispose(); m_QueuedConnections.Dispose(); m_PipelineReliableIds.Dispose(); m_PipelineUnreliableIds.Dispose(); }
public Task StartAsync(CancellationToken cancellationToken) { cancellationToken.Register(() => { _shouldRun = false; _logger.LogInformation("Enet server is shutting down..."); }); _serverTask = Task.Factory.StartNew(() => { Library.Initialize(); _shouldRun = true; using (Host server = new Host()) { Address address = new Address { Port = _configuration.Port }; int pollingTimeout = _configuration.PollingTimeout; server.Create(address, (int)_configuration.PeerLimit); _logger.LogInformation($"Enet server listening at 0.0.0.0:{address.Port}"); Event netEvent; while (_shouldRun) { bool polled = false; while (!polled) { if (server.CheckEvents(out netEvent) <= 0) { if (server.Service(pollingTimeout, out netEvent) <= 0) { break; } polled = true; } switch (netEvent.Type) { case EventType.None: break; case EventType.Connect: _connectionHandlers.OnConnectedPeer(netEvent.Peer); break; case EventType.Disconnect: _disconnectionHandlers.OnDisconnectedPeer(netEvent.Peer); break; case EventType.Timeout: _timeoutHandlers.OnTimeoutPeer(netEvent.Peer); break; case EventType.Receive: _packetHandlers.OnPacketReceived(netEvent.Peer, netEvent.ChannelID, netEvent.Packet); break; } } } server.Flush(); } _logger.LogInformation("Enet server closed."); Library.Deinitialize(); }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current); return(_serverTask); }