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(); }
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(); } }
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; } }