using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace MelonVPNCore { public class AsynchronousClient { private const int port = 22035; private ManualResetEvent connectDone = new ManualResetEvent(false); private ManualResetEvent receiveDone = new ManualResetEvent(false); private string response = ""; private Socket client; private void StartClient() { // Connect to a remote device. try { IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1"); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); client = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client); connectDone.WaitOne(); // Receive the response from the remote device. Receive(client); receiveDone.WaitOne(); // Write the response to the console. Console.WriteLine("Response received : {0}", response); // Release the socket. client.Shutdown(SocketShutdown.Both); client.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } public void Send(string msg) { Send(client, msg + ""); } public string Receive() { if (client == null) return null; Receive(client); receiveDone.WaitOne(); return response; } private void ConnectCallback(IAsyncResult ar) { try { Socket client = (Socket)ar.AsyncState; client.EndConnect(ar); Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint.ToString()); connectDone.Set(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } public string Receive() { try { StateObject state = new StateObject { workSocket = client }; client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } catch (Exception e) { Console.WriteLine(e); } receiveDone.WaitOne(); } private static void ReceiveCallback(IAsyncResult ar) { try { StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; int bytesRead = client.EndReceive(ar); if (bytesRead > 0) { state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } else { if (state.sb.Length > 1) response = state.sb.ToString(); if (receiveDone != null) receiveDone.Set(); } } catch (Exception e) { Console.WriteLine(e); } } private static void Send(Socket client, string data) { byte[] byteData = Encoding.ASCII.GetBytes(data); client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), client); } private static void SendCallback(IAsyncResult ar) { try { Socket client = (Socket)ar.AsyncState; int bytesSent = client.EndSend(ar); Console.WriteLine("Sent {0} bytes to server.", bytesSent); } catch (Exception e) { Console.WriteLine(e); } } } }