public Form1(Server server) { InitializeComponent(); Login_Helper.InitializeDB(); this.server = server; logwork.DoWork += Logwork_DoWork; logwork.RunWorkerCompleted += Logwork_RunWorkerCompleted; userWork.DoWork += UserWork_DoWork; userWork.RunWorkerCompleted += UserWork_RunWorkerCompleted; logwork.RunWorkerAsync(); userWork.RunWorkerAsync(); }
private void ReceiveCallback(IAsyncResult ar) { //better to initailize these outside the try catch to make them accessable throughout method Socket socket = (Socket)ar.AsyncState; ProcessCodes code; string[] msg; int received; string text; byte[] dataBuff; //Everythings done in a try catch in case the client unexpectedly disconnects it doesnt crash the server try { received = socket.EndReceive(ar); Users user = userList.Find(i => i.IP == socket.RemoteEndPoint.ToString()); if (user.Name != null && user.Name != "") { log("Received msg from " + user.Name); } dataBuff = new byte[received]; Array.Copy(g_buffer, dataBuff, received); text = Encoding.ASCII.GetString(dataBuff); msg = text.Split(' '); } catch (SocketException) { Users user = userList.Find(i => i.IP == socket.RemoteEndPoint.ToString()); if (user.Name != null && user.Name != "") { log(user.Name + " Has Forcefully Disconnected!"); Login_Helper.UpdateUser(user.Name); } else { log("Random Client Has Forcefully Disconnected! " + socket.RemoteEndPoint.ToString()); } var ItemToRemove = userList.Single(i => i.IP == socket.RemoteEndPoint.ToString()); socket.Close(); //clientSockets.Remove(socket); userList.Remove(ItemToRemove); return; } //incase the code given is not an actual code so we dont run into formatting problems and the server crashes try { code = (ProcessCodes)UInt16.Parse(msg[0]); } catch (System.FormatException e) { var toRemove = userList.Single(i => i.IP == socket.RemoteEndPoint.ToString()); userList.Remove(toRemove); log("Error connecting user, possibly malicaious " + socket.RemoteEndPoint); return; } switch (code)//first item is always code { case ProcessCodes.Login: { ErrorCodes tempCode = Login_Helper.doLogin(msg[1], msg[2]); byte[] data = Encoding.ASCII.GetBytes(Convert.ToString(tempCode)); if (tempCode == ErrorCodes.Success) { log(msg[1] + " Has Logged In!"); userList.Find(i => i.IP == socket.RemoteEndPoint.ToString()).Name = msg[1]; IPEndPoint ipAdd = socket.RemoteEndPoint as IPEndPoint; Login_Helper.UpdateUser(ipAdd.ToString(), msg[1], 1); } socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); socket.BeginReceive(g_buffer, 0, g_buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket); } break; case ProcessCodes.Version: { if (clientVersion.Equals(msg[1])) { log("Client versions matched, cleared for login"); byte[] data = Encoding.ASCII.GetBytes(Convert.ToString(ErrorCodes.Version_Success.ToString())); socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); socket.BeginReceive(g_buffer, 0, g_buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket); } else { log("Client versions do match closing client"); byte[] data = Encoding.ASCII.GetBytes(Convert.ToString(ErrorCodes.Error.ToString()) + " " + clientVersion); socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); socket.BeginReceive(g_buffer, 0, g_buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket); } } break; default: { ProcessError(ar); } break; } }