Example #1
0
 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();
 }
Example #2
0
        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;
            }
        }