static void SendClientName(Socket s, String clientName) { ClientNameMsg nameMsg = new ClientNameMsg(); nameMsg.name = clientName; MemoryStream outStream = nameMsg.WriteData(); s.Send(outStream.GetBuffer()); }
static void clientReceive(Object o) { Form1 form = (Form1)o; while (form.bConnected == true) { try { byte[] buffer = new byte[4096]; int result; result = form.client.Receive(buffer); if (result > 0) { MemoryStream stream = new MemoryStream(buffer); BinaryReader read = new BinaryReader(stream); Msg m = Msg.DecodeStream(read); if (m != null) { Console.Write("Got a message: "); switch (m.mID) { case PublicChatMsg.ID: { PublicChatMsg publicMsg = (PublicChatMsg)m; form.AddMessageText(publicMsg.msg); } break; case PrivateChatMsg.ID: { PrivateChatMsg privateMsg = (PrivateChatMsg)m; form.AddMessageText(privateMsg.msg); } break; case ClientListMsg.ID: { ClientListMsg clientList = (ClientListMsg)m; form.SetClientList(clientList); } break; case ClientNameMsg.ID: { ClientNameMsg clientName = (ClientNameMsg)m; form.SetClientName(clientName.name); } break; case GameMsg.ID: { GameMsg gameMessage = (GameMsg)m; form.AddGameText(gameMessage.msg); } break; default: break; } } } } catch (Exception) { form.bConnected = false; Console.WriteLine("Lost server!"); } } }
/* * Receive messages from the server */ static void clientReceive(Object o) { Form1 form = (Form1)o; while (form.m_Connected == true) { try { byte[] buffer = new byte[4096]; if (form.m_Server.Receive(buffer) > 0) { MemoryStream stream = new MemoryStream(buffer); BinaryReader read = new BinaryReader(stream); Msg m = Msg.DecodeStream(read); if (m != null) { switch (m.mID) { case ClientNameMsg.ID: { ClientNameMsg clientName = (ClientNameMsg)m; form.SetClientName(clientName.name); } break; case ActionMsg.ID: { ActionMsg actionMessage = (ActionMsg)m; form.AddActionText(actionMessage.msg); } break; case LoginMsg.ID: { LoginMsg recievedLoginMsg = (LoginMsg)m; switch (recievedLoginMsg.msg.Split(' ')[0]) { case "LoginAccepted": m_MainForm.Invoke(new MethodInvoker(delegate() { m_LoginForm.Close(); m_MainForm.Enabled = true; m_MainForm.Show(); m_MainForm.WindowState = FormWindowState.Normal; })); break; case "LoginFailed": m_MainForm.Invoke(new MethodInvoker(delegate() { // Clear text boxes and display error message m_LoginForm.ClearTextBoxes("Incorrect login details"); })); break; case "UserAlreadyLoggedIn": m_MainForm.Invoke(new MethodInvoker(delegate() { // Clear text boxes and display error message m_LoginForm.ClearTextBoxes("User logged in already"); })); break; case "AuthenticateRequested": m_MainForm.Invoke(new MethodInvoker(delegate() { m_MainForm.ReenterLoginDetails(); })); break; case "Salt": // If not one of the above confirm/deny strings then the message is the password salt sent back from the server in order to compare password hashs. Byte[] salt = Convert.FromBase64String(recievedLoginMsg.msg.Split(' ')[1]); m_MainForm.Invoke(new MethodInvoker(delegate() { // Handing the salt back to the login form as we don't want to store the plaintext password anywhere, it is only ever read from the password box m_LoginForm.logInWithSaltedHash(salt); })); break; } } break; case CreateNewUserMsg.ID: { // Returned through new user creation process CreateNewUserMsg recievedNameCheck = (CreateNewUserMsg)m; switch (recievedNameCheck.msg) { case "NameAvailable": m_MainForm.Invoke(new MethodInvoker(delegate() { m_RegisterNewUserForm.UserNameAccepted(); })); break; case "NameTaken": m_MainForm.Invoke(new MethodInvoker(delegate() { m_RegisterNewUserForm.UserNameRejected(); })); break; case "Success": m_MainForm.Invoke(new MethodInvoker(delegate() { m_RegisterNewUserForm.Close(); })); break; } } break; case UpdatePasswordMsg.ID: { UpdatePasswordMsg updatePasswordMsg = (UpdatePasswordMsg)m; switch (updatePasswordMsg.msg) { case "UpdatePasswordRequired": m_MainForm.Invoke(new MethodInvoker(delegate() { m_MainForm.OpenUpdatePasswordForm(); })); break; case "SuccessUpdatedPassword": m_MainForm.Invoke(new MethodInvoker(delegate() { m_UpdatePasswordForm.Close(); })); break; } } break; } } } } catch (Exception) { form.m_Connected = false; Console.WriteLine("Lost connection."); try { m_MainForm.Enabled = false; // if the login window is closed if (m_LoginForm.Visible == false) { m_LoginForm.ShowDialog(); } m_MainForm.Invoke(new MethodInvoker(delegate() { m_LoginForm.showDisconnectedMessage(); m_MainForm.Hide(); })); } catch { } } } Application.Restart(); }