using System; using System.Net; using System.Text; using System.Net.Sockets; namespace Launcher_Client.Networking { class Client { public delegate void LoginEventHandler(String ServerMessage); public event LoginEventHandler Completed; public String MessageReceived; private Socket ClientSocket; private Byte[] ClientBuffer; public Client() { try { IPAddress ConnectIP = IPAddress.Parse(Properties.Settings.Default.ConnectIP); IPEndPoint ConnectEndPoint = new IPEndPoint(ConnectIP, Properties.Settings.Default.ConnectPort); ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ClientSocket.BeginConnect(ConnectEndPoint, new AsyncCallback(Connected), ClientSocket); } catch (Exception Error) { Utility.Error(Error.Message); Utility.Shutdown(); } } private void Connected(IAsyncResult Result) { try { ClientSocket.EndConnect(Result); } catch (Exception Error) { Utility.Error(Error.Message); Utility.Shutdown(); } } public void SendLogin(String Username, String Password) { try { String EncryptedMessage = String.Format("Login#{0}#{1}", Username, Password); Send(EncryptedMessage); ClientBuffer = new Byte[Properties.Settings.Default.ByteSize]; ClientSocket.BeginReceive(ClientBuffer, 0, ClientBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveLogin), ClientSocket); } catch (Exception Error) { Utility.Error(Error.Message); Utility.Shutdown(); } } private void ReceiveLogin(IAsyncResult Result) { try { Int32 ReceivedLength = ClientSocket.EndReceive(Result); Array.Resize(ref ClientBuffer, ReceivedLength); if (ReceivedLength != 0) { String DecryptedMessage = Crypto.Decrypt(Encoding.ASCII.GetString(ClientBuffer), Properties.Settings.Default.EncryptionKey); MessageReceived = DecryptedMessage; } Completed(MessageReceived); } catch (Exception Error) { Utility.Error(Error.Message); Utility.Shutdown(); } } private void Send(String Message) { try { Byte[] Buffer = Encoding.ASCII.GetBytes(Crypto.Encrypt(Message, Properties.Settings.Default.EncryptionKey)); ClientSocket.BeginSend(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(MessageSent), ClientSocket); } catch { } } private void MessageSent(IAsyncResult Result) { try { ClientSocket.EndSend(Result); } catch { } } } }