コード例 #1
0
        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();
        }
コード例 #2
0
        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);
        }