public void Connect(IAccount addAccount, IAccount connectAccount)
        {
            var clock          = new Clock();
            var playerFactory  = new PlayerFactory();
            var playerDatabase = new PlayerDiskDatabase <IPlayer, IPlayerFactory <IPlayer> >(testDatabasePath, false);
            var logger         = new ConsoleLogger(clock);

            var room   = new RoomUdpSocket <IPlayer, IPlayerFactory <IPlayer> >(0, "Test Room #0", clock, playerFactory, playerDatabase, logger);
            var client = new QueuedUdpSocket(logger);

            room.Start();
            client.Start();

            room.AddPlayer(addAccount, out Token connectToken);

            var remoteEndPoint = new IPEndPoint(IPAddress.Loopback, room.LocalEndPoint.Port);

            client.Send(new ConnectUdpRequest(connectAccount.ID, connectToken, remoteEndPoint));

            Datagram datagram;

            while (!client.TryDequeueNext(out datagram))
            {
            }
            Assert.AreEqual((byte)RoomDatagramType.Connect, datagram.Type);

            var response = new ConnectUdpResponse(datagram);

            Assert.AreEqual((byte)ConnectUdpResponse.ResultType.Success, response.result);

            room.Close();
            client.Close();
        }
Ejemplo n.º 2
0
        protected void OnConnectRequest(Datagram datagram)
        {
            IUdpRequestResponse response;

            try
            {
                var request = new ConnectUdpRequest(datagram);

                if (!players.TryGetValue(request.id, out TPlayer player))
                {
                    return;
                }

                if (player.ConnecToken != request.connectToken)
                {
                    response = new ConnectUdpResponse(ConnectUdpResponse.ResultType.IncorrectToken);
                    Send(response, datagram.ipEndPoint);

                    if (logger.Log(LogType.Debug))
                    {
                        logger.Debug($"Failed to connect room UDP socket player, incorrect token. (id: {request.id}, remoteEndPoint: {datagram.ipEndPoint}, roomID: {id})");
                    }
                }

                player.RemoteEndPoint = datagram.ipEndPoint;
                player.LastActionMS   = clock.MS;
                response = new ConnectUdpResponse(ConnectUdpResponse.ResultType.Success);
                Send(response, datagram.ipEndPoint);

                if (logger.Log(LogType.Info))
                {
                    logger.Info($"Connected a new room UDP socket player. (id: {request.id}, remoteEndPoint: {datagram.ipEndPoint}, roomID: {id})");
                }
            }
            catch
            {
                response = new ConnectUdpResponse(ConnectUdpResponse.ResultType.BadRequest);
                Send(response, datagram.ipEndPoint);

                if (logger.Log(LogType.Debug))
                {
                    logger.Debug($"Failed to connect room UDP socket player, bad request. (remoteEndPoint: {datagram.ipEndPoint}, roomID: {id})");
                }
            }
        }