private void AcceptCallback(IAsyncResult ar)
        {
            LoginSocketState state = (LoginSocketState)ar.AsyncState;

            try {
                Socket client = state.Socket.EndAccept(ar);

                Thread.Sleep(1);

                if (state.Type == LoginSocketState.SocketType.Client)
                {
                    _clientManagerReset.Set();
                }
                else if (state.Type == LoginSocketState.SocketType.Search)
                {
                    _searchManagerReset.Set();
                }

                state.Socket = client;

                Log(Category, String.Format("[{0}] New Client: {1}:{2}", state.Type, ((IPEndPoint)state.Socket.RemoteEndPoint).Address, ((IPEndPoint)state.Socket.RemoteEndPoint).Port));

                if (state.Type == LoginSocketState.SocketType.Client)
                {
                    // ClientManager server sends data first
                    byte[] buffer = LoginServerMessages.GenerateServerChallenge(ref state);
                    SendToClient(ref state, buffer);

                    if (state != null)
                    {
                        state.State++;
                    }
                }
                else if (state.Type == LoginSocketState.SocketType.Search)
                {
                    // SearchManager server waits for data first
                }
            } catch (NullReferenceException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            } catch (SocketException e) {
                LogError(Category, "Error accepting client");
                LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return;
            }

            WaitForData(ref state);
        }
        private void WaitForData(ref LoginSocketState state)
        {
            Thread.Sleep(10);

            try {
                if (state.DataReceivedCallback == null)
                {
                    state.DataReceivedCallback = OnDataReceived;
                }

                state.Socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, state.DataReceivedCallback, state);
            } catch (NullReferenceException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            } catch (ObjectDisposedException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            } catch (SocketException e) {
                if (e.SocketErrorCode == SocketError.NotConnected)
                {
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;
                }

                if (e.SocketErrorCode != SocketError.ConnectionAborted &&
                    e.SocketErrorCode != SocketError.ConnectionReset)
                {
                    LogError(Category, "Error receiving data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                }
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return;
            }
        }
Beispiel #3
0
        public bool SendToClient(ref LoginSocketState state, byte[] data)
        {
            if (data == null || state == null || state.Socket == null)
                return false;

            try {
                if (state.SendCallback == null)
                    state.SendCallback = OnSent;

                state.Socket.BeginSend(data, 0, data.Length, SocketFlags.None, state.SendCallback, state);
                return true;
            } catch (NullReferenceException) {
                if (state != null)
                    state.Dispose();
                state = null;
                return false;
            } catch (SocketException e) {
                if (e.SocketErrorCode != SocketError.ConnectionAborted &&
                    e.SocketErrorCode != SocketError.ConnectionReset) {
                    LogError(Category, "Error sending data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                }
                if (state != null)
                    state.Dispose();
                state = null;
                return false;
            }
        }
 private void HandleSearchManager(ref LoginSocketState state, string query, Dictionary <string, string> keyValues)
 {
     if (state.State == 0)
     {
         if (query.Equals("nicks", StringComparison.InvariantCultureIgnoreCase))
         {
             SendToClient(ref state, LoginServerMessages.SendNicks(ref state, keyValues));
         }
         else if (query.Equals("check", StringComparison.InvariantCultureIgnoreCase))
         {
             SendToClient(ref state, LoginServerMessages.SendCheck(ref state, keyValues));
         }
         else if (query.Equals("search", StringComparison.InvariantCultureIgnoreCase))
         {
             SendToClient(ref state, LoginServerMessages.SendSearch(ref state, keyValues));
         }
         else if (query.Equals("newuser", StringComparison.InvariantCultureIgnoreCase))
         {
             SendToClient(ref state, LoginServerMessages.NewUser(ref state, keyValues));
         }
         else
         {
             Log(Category, String.Format("[{0}] Unhandled query type: {1}", state.Type, query));
         }
     }
     else if (state.State == 1)
     {
         state.State++;
     }
     else if (state.State >= 2)
     {
         state.Dispose();
     }
 }
 public static void Logout(ref LoginSocketState state, Dictionary<string, string> keyValues)
 {
     // we're not doing anything about session, so no need to reset it back to 0...
     // maybe one day though...
     /*Dictionary<string, object> clientData = new Dictionary<string, object>() {
         { "session", (Int64)0 }
     };
     LoginDatabase.Instance.SetData(state.Name, clientData);*/
     state.Dispose();
 }
        private void OnSent(IAsyncResult async)
        {
            LoginSocketState state = (LoginSocketState)async.AsyncState;

            if (state == null || state.Socket == null)
            {
                return;
            }

            try {
                int sent = state.Socket.EndSend(async);
                Log(Category, String.Format("[{0}] Sent {1} byte response to: {2}:{3}", state.Type, sent, ((IPEndPoint)state.Socket.RemoteEndPoint).Address, ((IPEndPoint)state.Socket.RemoteEndPoint).Port));
            } catch (NullReferenceException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            } catch (SocketException e) {
                switch (e.SocketErrorCode)
                {
                case SocketError.ConnectionReset:
                case SocketError.Disconnecting:
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;

                default:
                    LogError(Category, "Error sending data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;
                }
            }
        }
Beispiel #7
0
        public static void Logout(ref LoginSocketState state, Dictionary <string, string> keyValues)
        {
            // we're not doing anything about session, so no need to reset it back to 0...
            // maybe one day though...

            /*Dictionary<string, object> clientData = new Dictionary<string, object>() {
             *      { "session", (Int64)0 }
             * };
             * LoginDatabase.Instance.SetData(state.Name, clientData);*/
            state.Dispose();
        }
        private void HandleClientManager(ref LoginSocketState state, string query, Dictionary <string, string> keyValues)
        {
            if (state == null || String.IsNullOrWhiteSpace(query) || keyValues == null)
            {
                return;
            }

            if (state.State == 1)
            {
                if (query.Equals("login", StringComparison.InvariantCultureIgnoreCase))
                {
                    SendToClient(ref state, LoginServerMessages.SendProof(ref state, keyValues));
                    state.StartKeepAlive(this);
                }
                else if (query.Equals("newuser", StringComparison.InvariantCultureIgnoreCase))
                {
                    SendToClient(ref state, LoginServerMessages.NewUser(ref state, keyValues));
                }
            }
            else if (state.State == 2)
            {
                if (query.Equals("status", StringComparison.InvariantCultureIgnoreCase))
                {
                    //LogError("STATUS NOT RESPONDED","1");
                    //SendToClient(ref state, LoginServerMessages.StatusResponse(ref state, keyValues));
                }
                else if (query.Equals("getprofile", StringComparison.InvariantCultureIgnoreCase))
                {
                    SendToClient(ref state, LoginServerMessages.SendProfile(ref state, keyValues, false));
                }
                else if (query.Equals("updatepro", StringComparison.InvariantCultureIgnoreCase))
                {
                    LoginServerMessages.UpdateProfile(ref state, keyValues);
                }
            }
            else if (state.State == 3)
            {
                if (query.Equals("logout", StringComparison.InvariantCultureIgnoreCase))
                {
                    LoginServerMessages.Logout(ref state, keyValues);
                }
                else if (query.Equals("getprofile", StringComparison.InvariantCultureIgnoreCase))
                {
                    SendToClient(ref state, LoginServerMessages.SendProfile(ref state, keyValues, true));
                }
            }
            else if (state.State >= 4)
            {
                state.Dispose();
            }
        }
        public bool SendToClient(ref LoginSocketState state, byte[] data)
        {
            if (data == null || state == null || state.Socket == null)
            {
                return(false);
            }

            try {
                if (state.SendCallback == null)
                {
                    state.SendCallback = OnSent;
                }

                state.Socket.BeginSend(data, 0, data.Length, SocketFlags.None, state.SendCallback, state);
                //LogError("data sent:", System.Text.Encoding.Default.GetString(data));
                return(true);
            } catch (NullReferenceException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return(false);
            } catch (SocketException e) {
                if (e.SocketErrorCode != SocketError.ConnectionAborted &&
                    e.SocketErrorCode != SocketError.ConnectionReset)
                {
                    LogError(Category, "Error sending data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                }
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return(false);
            }
        }
Beispiel #10
0
 private void HandleSearchManager(ref LoginSocketState state, string query, Dictionary <string, string> keyValues)
 {
     if (state.State == 0)
     {
         if (query.Equals("nicks", StringComparison.InvariantCultureIgnoreCase))
         {
             SendToClient(ref state, LoginServerMessages.SendNicks(ref state, keyValues));
         }
         else if (query.Equals("check", StringComparison.InvariantCultureIgnoreCase))
         {
             SendToClient(ref state, LoginServerMessages.SendCheck(ref state, keyValues));
         }
     }
     else if (state.State == 1)
     {
         state.State++;
     }
     else if (state.State >= 2)
     {
         state.Dispose();
     }
 }
Beispiel #11
0
        private void OnDataReceived(IAsyncResult async)
        {
            LoginSocketState state = (LoginSocketState)async.AsyncState;

            if (state == null || state.Socket == null)
            {
                return;
            }

            try {
                // receive data from the socket
                int received = state.Socket.EndReceive(async);
                if (received == 0)
                {
                    // when EndReceive returns 0, it means the socket on the other end has been shut down.
                    return;
                }

                // take what we received, and append it to the received data buffer
                state.ReceivedData.Append(Encoding.UTF8.GetString(state.Buffer, 0, received));
                string receivedData = state.ReceivedData.ToString();

                // does what we received contain the \final\ delimiter?
                if (receivedData.LastIndexOf(@"\final\") > -1)
                {
                    state.ReceivedData.Clear();
                    //Log("data received:", receivedData);
                    int lame = state.State;
                    //Log("state.state:", lame.ToString() );//
                    // lets split up the message based on the delimiter
                    string[] messages = receivedData.Split(new string[] { @"\final\" }, StringSplitOptions.RemoveEmptyEntries);

                    for (int i = 0; i < messages.Length; i++)
                    {
                        ParseMessage(ref state, messages[i]);
                    }
                }
            } catch (ObjectDisposedException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return;
            } catch (SocketException e) {
                switch (e.SocketErrorCode)
                {
                case SocketError.ConnectionReset:
                case SocketError.Disconnecting:
                case SocketError.NotConnected:
                case SocketError.TimedOut:
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;

                default:
                    LogError(Category, "Error receiving data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;
                }
            } catch (Exception e) {
                LogError(Category, "Error receiving data");
                LogError(Category, e.ToString());
            }

            // and we wait for more data...
            WaitForData(ref state);
        }
Beispiel #12
0
        private void WaitForData(ref LoginSocketState state)
        {
            Thread.Sleep(10);

            try {
                if (state.DataReceivedCallback == null)
                    state.DataReceivedCallback = OnDataReceived;

                state.Socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, state.DataReceivedCallback, state);
            } catch (NullReferenceException) {
                if (state != null)
                    state.Dispose();
                state = null;
            } catch (ObjectDisposedException) {
                if (state != null)
                    state.Dispose();
                state = null;
            } catch (SocketException e) {
                if (e.SocketErrorCode == SocketError.NotConnected) {
                    if (state != null)
                        state.Dispose();
                    state = null;
                    return;
                }

                if (e.SocketErrorCode != SocketError.ConnectionAborted &&
                    e.SocketErrorCode != SocketError.ConnectionReset) {
                    LogError(Category, "Error receiving data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                }
                if (state != null)
                    state.Dispose();
                state = null;
                return;
            }
        }
Beispiel #13
0
 private void HandleSearchManager(ref LoginSocketState state, string query, Dictionary<string, string> keyValues)
 {
     if (state.State == 0) {
         if (query.Equals("nicks", StringComparison.InvariantCultureIgnoreCase)) {
             SendToClient(ref state, LoginServerMessages.SendNicks(ref state, keyValues));
         } else if (query.Equals("check", StringComparison.InvariantCultureIgnoreCase)) {
             SendToClient(ref state, LoginServerMessages.SendCheck(ref state, keyValues));
         }
     } else if (state.State == 1) {
         state.State++;
     } else if (state.State >= 2) {
         state.Dispose();
     }
 }
Beispiel #14
0
        private void HandleClientManager(ref LoginSocketState state, string query, Dictionary<string, string> keyValues)
        {
            if (state == null || String.IsNullOrWhiteSpace(query) || keyValues == null) {
                return;
            }

            if (state.State == 1) {
                if (query.Equals("login", StringComparison.InvariantCultureIgnoreCase)) {
                    SendToClient(ref state, LoginServerMessages.SendProof(ref state, keyValues));
                    state.StartKeepAlive(this);
                } else if (query.Equals("newuser", StringComparison.InvariantCultureIgnoreCase)) {
                    SendToClient(ref state, LoginServerMessages.NewUser(ref state, keyValues));
                }
            } else if (state.State == 2) {
                if (query.Equals("getprofile", StringComparison.InvariantCultureIgnoreCase)) {
                    SendToClient(ref state, LoginServerMessages.SendProfile(ref state, keyValues, false));
                } else if (query.Equals("updatepro", StringComparison.InvariantCultureIgnoreCase)) {
                    LoginServerMessages.UpdateProfile(ref state, keyValues);
                }
            } else if (state.State == 3) {
                if (query.Equals("logout", StringComparison.InvariantCultureIgnoreCase)) {
                    LoginServerMessages.Logout(ref state, keyValues);
                } else if (query.Equals("getprofile", StringComparison.InvariantCultureIgnoreCase)) {
                    SendToClient(ref state, LoginServerMessages.SendProfile(ref state, keyValues, true));
                }
            } else if (state.State >= 4) {
                state.Dispose();
            }
        }