Guest User

Untitled

a guest
Jul 19th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.59 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. using MySql.Data.MySqlClient;
  8.  
  9. namespace rpc_server
  10. {
  11. public class Client
  12. {
  13.  
  14. private TcpClient Connection;
  15. public List<String> Messages = new List<string>();
  16.  
  17. public static List<String> Users = new List<string>();
  18. public string Username = "Unknown-";
  19. public string AESKey;
  20. public Player Player1;
  21. Sender Sender;
  22. public string IPAddress;
  23.  
  24. bool Authenticated = false;
  25.  
  26. public static List<int> SequenceNumbers = new List<int>();
  27. public int SequenceIndex;
  28. List<int> RecentNumbers = new List<int>();
  29.  
  30. Thread SenderThread;
  31.  
  32. public Client(TcpClient Connection)
  33. {
  34.  
  35. this.Connection = Connection;
  36. SequenceNumbers.Add(0);
  37. SequenceIndex = SequenceNumbers.Count - 1;
  38. Console.WriteLine("Unknown: Connected");
  39.  
  40. }
  41.  
  42. public bool ValidSequence(int Number)
  43. {
  44.  
  45. if (Number >= SequenceNumbers[SequenceIndex] - 100 && Number <= SequenceNumbers[SequenceIndex] + 100)
  46. {
  47.  
  48. if (RecentNumbers.Contains(Number))
  49. {
  50.  
  51. RecentNumbers.Add(Number);
  52.  
  53. if (RecentNumbers.Count > 300)
  54. RecentNumbers.RemoveAt(0);
  55.  
  56. return false;
  57.  
  58. }
  59.  
  60. else
  61. {
  62.  
  63. RecentNumbers.Add(Number);
  64.  
  65. if (RecentNumbers.Count > 300)
  66. RecentNumbers.RemoveAt(0);
  67.  
  68. return true;
  69.  
  70. }
  71.  
  72. }
  73.  
  74. else
  75. return false;
  76.  
  77. }
  78.  
  79. public MySqlConnection database()
  80. {
  81. String connString = "Server=127.0.0.1;Port=3306;Database=rpc;Uid=server;password=Derp123;";
  82. MySqlConnection conn = new MySqlConnection(connString);
  83. //MySqlCommand command = conn.CreateCommand();
  84. /*
  85. command.CommandText = "Select * from user";
  86. try
  87. {
  88. conn.Open();
  89. }
  90. catch (Exception ex)
  91. {
  92. Console.WriteLine(ex);
  93. }
  94. MySqlDataReader reader = command.ExecuteReader();
  95. while (reader.Read())
  96. {
  97. Console.WriteLine(reader["username"].ToString() + " " + reader["Password"].ToString());
  98.  
  99. }
  100. //Console.ReadLine();
  101. */
  102. return conn;
  103. }
  104.  
  105. public bool Login(string data)
  106. {
  107.  
  108. String[] Blocks = data.Split(new String[] { "||" }, StringSplitOptions.None);
  109. MySqlConnection conn = database();
  110. MySqlCommand command = conn.CreateCommand();
  111. MySqlDataReader reader;
  112.  
  113. #region check_login
  114. command.CommandText = "Select * from user Where UserName='" + Blocks[0] + "'";
  115.  
  116. try
  117. {
  118. conn.Open();
  119. reader = command.ExecuteReader();
  120. while (reader.Read()) //take the sql and make sure the username exists
  121. {
  122. String result = reader["UserName"].ToString();
  123.  
  124. if (Blocks[0].Equals(result, StringComparison.Ordinal))
  125. {
  126. // matching username found
  127. if(Blocks[1].Equals(reader["Password"].ToString()))
  128. {
  129. //matching pw
  130.  
  131. Authenticated = true;
  132. return true;
  133. }
  134. else
  135. {
  136. //bad pw
  137. return false;
  138. }
  139. }
  140.  
  141. else
  142. {
  143. //no matching username
  144. return false;
  145. }
  146. }
  147. }
  148. catch (Exception ex)
  149. {
  150. //msql failure
  151. Console.WriteLine(ex);
  152. }
  153. #endregion
  154. return false;
  155. }
  156.  
  157. public void Handle(byte[] Message)
  158. {
  159.  
  160. UnicodeEncoding Encoder = new UnicodeEncoding();
  161.  
  162. String[] Blocks = Encoder.GetString(Message).Split(new String[] { "::" }, StringSplitOptions.None);
  163.  
  164. Sender = new rpc_server.Sender { Connection = Connection, SequenceIndex = SequenceIndex, AESKey = AESKey};
  165. SenderThread = new Thread(new ThreadStart(Sender.Listen));
  166. SenderThread.Start();
  167.  
  168. switch (Blocks[0])
  169. {
  170.  
  171. case "Login":
  172. {
  173.  
  174. if (Login(Blocks[1]))
  175. {
  176. //send authenticated.
  177. Sender.Send("Auth_suc", "");
  178. MatchMaking.Current.JoinMatchMaking(this);
  179.  
  180. }
  181.  
  182. else
  183. {
  184. //send noauth
  185. Sender.Send("Auth_fail", "");
  186. }
  187.  
  188. break;
  189. }
  190. default:
  191. {
  192. break;
  193. }
  194.  
  195. }
  196.  
  197.  
  198.  
  199. }
  200.  
  201. public void Listener()
  202. {
  203.  
  204. if (Connection.Connected)
  205. {
  206.  
  207. NetworkStream clientStream = Connection.GetStream();
  208.  
  209. byte[] message = new byte[4096];
  210. int bytesRead;
  211.  
  212. while (true)
  213. {
  214.  
  215. bytesRead = 0;
  216.  
  217. try
  218. {
  219.  
  220. //blocks until a client sends a message
  221.  
  222.  
  223. bytesRead = clientStream.Read(message, 0, 4096);
  224.  
  225. }
  226. catch
  227. {
  228.  
  229. //a socket error has occured
  230. if (SenderThread != null)
  231. SenderThread.Abort(0);
  232.  
  233. Users.Remove(Username);
  234. break;
  235.  
  236. }
  237.  
  238. if (bytesRead == 0)
  239. {
  240.  
  241. //the client has disconnected from the server
  242. if (SenderThread != null)
  243. SenderThread.Abort(0);
  244. Users.Remove(Username);
  245. break;
  246.  
  247. }
  248.  
  249. byte[] Slim = new byte[bytesRead];
  250.  
  251. Buffer.BlockCopy(message, 0, Slim, 0, bytesRead);
  252. Handle(Slim);
  253.  
  254. }
  255.  
  256. Connection.Close();
  257.  
  258. }
  259.  
  260. }
  261.  
  262.  
  263. }
  264.  
  265.  
  266. public class Sender
  267. {
  268.  
  269. public TcpClient Connection;
  270. public string AESKey;
  271. public int SequenceIndex;
  272.  
  273. public int Index = 0;
  274. public int LastCount = 0;
  275. public List<String> Outgoing = new List<string>();
  276.  
  277. public Sender()
  278. {
  279.  
  280. Client.SequenceNumbers.Add(0);
  281. SequenceIndex = Client.SequenceNumbers.Count - 1;
  282.  
  283.  
  284.  
  285. }
  286.  
  287. public void Send(String Action, String Data)
  288. {
  289.  
  290. lock (Outgoing)
  291. {
  292.  
  293. Outgoing.Add(Action + "::" + Data);
  294.  
  295. }
  296.  
  297. }
  298.  
  299. public void Listen()
  300. {
  301.  
  302. while (true)
  303. {
  304.  
  305. if (Outgoing.Count > LastCount)
  306. {
  307.  
  308. lock (Outgoing)
  309. {
  310.  
  311. foreach (String Message in Outgoing)
  312. {
  313.  
  314. UnicodeEncoding Encoder = new UnicodeEncoding();
  315. NetworkStream clientStream = Connection.GetStream();
  316.  
  317. byte[] buffer = Encoder.GetBytes(Message);
  318.  
  319. clientStream.Write(buffer, 0, buffer.Length);
  320. clientStream.Flush();
  321.  
  322. }
  323.  
  324. Outgoing.Clear();
  325.  
  326. }
  327.  
  328. }
  329.  
  330. Thread.Sleep(250);
  331.  
  332. }
  333.  
  334. }
  335.  
  336. }
  337.  
  338. }
Add Comment
Please, Sign In to add comment