140 lines
4.2 KiB
C#
140 lines
4.2 KiB
C#
|
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 + "<EOF>");
|
|||
|
}
|
|||
|
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|