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; } }
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; } } }
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); } }
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(); } }
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); }
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; } }
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(); } }
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(); } }