示例#1
0
        public void Connect(IPEndPoint endPoint)
        {
            if (Client != null && Client.Connected)
            {
                throw new InvalidOperationException("Already connected to a server!");
            }
            EndPoint = endPoint;
            Client   = new TcpClient();
            Client.Connect(EndPoint);
            NetworkStream       = Client.GetStream();
            NetworkManager      = new NetworkManager(NetworkStream);
            NetworkingReset     = new ManualResetEvent(true);
            NetworkWorkerThread = new Thread(NetworkWorker);
            PhysicsWorkerThread = new Thread(PhysicsWorker);

            NetworkWorkerThread.Start();
            var handshake = new HandshakePacket(NetworkManager.ProtocolVersion,
                                                EndPoint.Address.ToString(), (ushort)EndPoint.Port, NetworkMode.Login);

            SendPacket(handshake);
            var login = new LoginStartPacket(Session.SelectedProfile.Name);

            SendPacket(login);
            PhysicsWorkerThread.Start();
        }
示例#2
0
        public void Parse(IReadable buffer)
        {
            // We can assume uncompressed for the time being
            int packetId = buffer.Reader.ReadVarInt();

            // Route the packet by its ID
            ServerboundPacket packet = null;

            switch (_Client.ClientState)
            {
            case ClientState.Handshaking:
                switch (packetId)
                {
                case 0x00:
                    packet = new HandshakePacket(_Client);
                    break;
                }
                break;

            case ClientState.Status:
                switch (packetId)
                {
                case 0x00:
                    packet = new RequestPacket(_Client);
                    break;

                case 0x01:
                    packet = new PingPacket(_Client);
                    break;
                }
                break;

            case ClientState.Login:
                switch (packetId)
                {
                case 0x00:
                    packet = new LoginStartPacket(_Client);
                    break;
                }
                break;
            }

            if (packet != null)
            {
                packet.Parse(buffer);                 // Parse the packet and queue clientbound packets
            }
        }
        private void HandleLoginStart(LoginStartPacket packet)
        {
            Player = Server.PlayerFactory.CreatePlayer(this, packet.Username);

            if (Server.RsaEncryption != null)             //We use encryption
            {
                _encryptionVerification = new byte[4];
                Random r = new Random(Environment.TickCount);
                r.NextBytes(_encryptionVerification);

                SendPacket(new EncryptionRequestPacket()
                {
                    ServerId    = "",
                    PublicKey   = Server.RsaEncryption.PublicKey,
                    VerifyToken = _encryptionVerification
                });
            }
            else
            {
                ChangeToPlay();
            }
        }
示例#4
0
        public void NewConnetcion(HandshakePacket handshake, IPEndPoint endPoint, Task stopTask)
        {
            var       stream     = handshake.Stream;
            Task      connection = null;
            TcpClient client     = null;

            if (destination != null)
            {
                client = new TcpClient();
                try
                {
                    connection = client.ConnectAsync(destination.Address, destination.Port);
                }
                catch (Exception)
                {
                    connection = null;
                }
            }
            var parser = new ParameterParser(new KeyValuePair <string, IParameterGroup>[]
            {
                new KeyValuePair <string, IParameterGroup>("hs", handshake),
                new KeyValuePair <string, IParameterGroup>("main", MainGroup.Instance),
                new KeyValuePair <string, IParameterGroup>("file", FileGroup.Instance),
                new KeyValuePair <string, IParameterGroup>("env", EnvGroup.Instance),
                new KeyValuePair <string, IParameterGroup>("sets", setsGroup)
            });

            if (connection != null)
            {
                try
                {
                    connection.Wait();
                    var realStream = client.GetStream();
                    handshake.Port = (ushort)destination.Port;
                    handshake.Send(realStream);
                    if (handshake.State == 2)
                    {
                        var loginPacket = new LoginStartPacket(stream);
                        loginPacket.Send(realStream);
                        log.WriteInfo($"Player '{loginPacket.PlayerName}' successfully login from {endPoint} to {record.Mask}.");
                    }
                    Task task1 = realStream.CopyToAsync(stream);
                    Task task2 = stream.CopyToAsync(realStream);
                    switch (Task.WaitAny(task1, task2, stopTask))
                    {
                    case 0:
                        Task.WaitAny(task2, stopTask);
                        break;

                    case 1:
                        Task.WaitAny(task1, stopTask);
                        break;

                    case 2:
                    default:
                        break;
                    }
                    realStream.Close();
                    client.Close();
                    return;
                }
                catch (Exception) { }
            }
            var selector = new PacketSelector(stream);

            switch (handshake.State)
            {
            case 1:
                selector.Catch();
                new RequestPacket(selector);
                var response = new ResponsePacket(parser, record.StatusPath);
                response.Send(stream);
                selector.Catch();
                if (selector.ID == 1 && selector.Size == 9)
                {
                    new PingPongPacket(selector).Send(stream);
                }
                break;

            case 2:
                var loginPacket = new LoginStartPacket(stream);
                new DisconnectPacket(parser, record.LoginPath).Send(stream);
                log.WriteInfo($"Player '{loginPacket.PlayerName}' tried to login from {endPoint} to {record.Mask}.");
                break;

            default:
                break;
            }
        }