Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net.Sockets;
- using System.Threading;
- using MySql.Data.MySqlClient;
- namespace rpc_server
- {
- public class Client
- {
- private TcpClient Connection;
- public List<String> Messages = new List<string>();
- public static List<String> Users = new List<string>();
- public string Username = "Unknown-";
- public string AESKey;
- public Player Player1;
- Sender Sender;
- public string IPAddress;
- bool Authenticated = false;
- public static List<int> SequenceNumbers = new List<int>();
- public int SequenceIndex;
- List<int> RecentNumbers = new List<int>();
- Thread SenderThread;
- public Client(TcpClient Connection)
- {
- this.Connection = Connection;
- SequenceNumbers.Add(0);
- SequenceIndex = SequenceNumbers.Count - 1;
- Console.WriteLine("Unknown: Connected");
- }
- public bool ValidSequence(int Number)
- {
- if (Number >= SequenceNumbers[SequenceIndex] - 100 && Number <= SequenceNumbers[SequenceIndex] + 100)
- {
- if (RecentNumbers.Contains(Number))
- {
- RecentNumbers.Add(Number);
- if (RecentNumbers.Count > 300)
- RecentNumbers.RemoveAt(0);
- return false;
- }
- else
- {
- RecentNumbers.Add(Number);
- if (RecentNumbers.Count > 300)
- RecentNumbers.RemoveAt(0);
- return true;
- }
- }
- else
- return false;
- }
- public MySqlConnection database()
- {
- String connString = "Server=127.0.0.1;Port=3306;Database=rpc;Uid=server;password=Derp123;";
- MySqlConnection conn = new MySqlConnection(connString);
- //MySqlCommand command = conn.CreateCommand();
- /*
- command.CommandText = "Select * from user";
- try
- {
- conn.Open();
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex);
- }
- MySqlDataReader reader = command.ExecuteReader();
- while (reader.Read())
- {
- Console.WriteLine(reader["username"].ToString() + " " + reader["Password"].ToString());
- }
- //Console.ReadLine();
- */
- return conn;
- }
- public bool Login(string data)
- {
- String[] Blocks = data.Split(new String[] { "||" }, StringSplitOptions.None);
- MySqlConnection conn = database();
- MySqlCommand command = conn.CreateCommand();
- MySqlDataReader reader;
- #region check_login
- command.CommandText = "Select * from user Where UserName='" + Blocks[0] + "'";
- try
- {
- conn.Open();
- reader = command.ExecuteReader();
- while (reader.Read()) //take the sql and make sure the username exists
- {
- String result = reader["UserName"].ToString();
- if (Blocks[0].Equals(result, StringComparison.Ordinal))
- {
- // matching username found
- if(Blocks[1].Equals(reader["Password"].ToString()))
- {
- //matching pw
- Authenticated = true;
- return true;
- }
- else
- {
- //bad pw
- return false;
- }
- }
- else
- {
- //no matching username
- return false;
- }
- }
- }
- catch (Exception ex)
- {
- //msql failure
- Console.WriteLine(ex);
- }
- #endregion
- return false;
- }
- public void Handle(byte[] Message)
- {
- UnicodeEncoding Encoder = new UnicodeEncoding();
- String[] Blocks = Encoder.GetString(Message).Split(new String[] { "::" }, StringSplitOptions.None);
- Sender = new rpc_server.Sender { Connection = Connection, SequenceIndex = SequenceIndex, AESKey = AESKey};
- SenderThread = new Thread(new ThreadStart(Sender.Listen));
- SenderThread.Start();
- switch (Blocks[0])
- {
- case "Login":
- {
- if (Login(Blocks[1]))
- {
- //send authenticated.
- Sender.Send("Auth_suc", "");
- MatchMaking.Current.JoinMatchMaking(this);
- }
- else
- {
- //send noauth
- Sender.Send("Auth_fail", "");
- }
- break;
- }
- default:
- {
- break;
- }
- }
- }
- public void Listener()
- {
- if (Connection.Connected)
- {
- NetworkStream clientStream = Connection.GetStream();
- byte[] message = new byte[4096];
- int bytesRead;
- while (true)
- {
- bytesRead = 0;
- try
- {
- //blocks until a client sends a message
- bytesRead = clientStream.Read(message, 0, 4096);
- }
- catch
- {
- //a socket error has occured
- if (SenderThread != null)
- SenderThread.Abort(0);
- Users.Remove(Username);
- break;
- }
- if (bytesRead == 0)
- {
- //the client has disconnected from the server
- if (SenderThread != null)
- SenderThread.Abort(0);
- Users.Remove(Username);
- break;
- }
- byte[] Slim = new byte[bytesRead];
- Buffer.BlockCopy(message, 0, Slim, 0, bytesRead);
- Handle(Slim);
- }
- Connection.Close();
- }
- }
- }
- public class Sender
- {
- public TcpClient Connection;
- public string AESKey;
- public int SequenceIndex;
- public int Index = 0;
- public int LastCount = 0;
- public List<String> Outgoing = new List<string>();
- public Sender()
- {
- Client.SequenceNumbers.Add(0);
- SequenceIndex = Client.SequenceNumbers.Count - 1;
- }
- public void Send(String Action, String Data)
- {
- lock (Outgoing)
- {
- Outgoing.Add(Action + "::" + Data);
- }
- }
- public void Listen()
- {
- while (true)
- {
- if (Outgoing.Count > LastCount)
- {
- lock (Outgoing)
- {
- foreach (String Message in Outgoing)
- {
- UnicodeEncoding Encoder = new UnicodeEncoding();
- NetworkStream clientStream = Connection.GetStream();
- byte[] buffer = Encoder.GetBytes(Message);
- clientStream.Write(buffer, 0, buffer.Length);
- clientStream.Flush();
- }
- Outgoing.Clear();
- }
- }
- Thread.Sleep(250);
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment