Could look like this
Code:
public class ProxyConnection
{
private static Socket m_ProxySocket;
private static byte[] m_buffer;
private static bool m_isClosing;
public static bool Connect(ushort ProxyPort)
{
if (m_ProxySocket == null)
{
m_ProxySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
if (m_ProxySocket.Connected)
{
m_isClosing = true;
m_ProxySocket.Shutdown(SocketShutdown.Both);
m_ProxySocket.Close();
m_ProxySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
if (m_buffer == null)
{
m_buffer = new byte[8192];
}
try
{
m_isClosing = false;
m_ProxySocket.Connect(IPAddress.Loopback, ProxyPort);
m_ProxySocket.BeginReceive(m_buffer, 0, 8192, SocketFlags.None, new AsyncCallback(WaitForData), m_ProxySocket);
return true;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return false;
}
}
private static void WaitForData(IAsyncResult ar)
{
if (m_ProxySocket != null)
{
if (m_isClosing == false)
{
try
{
Socket worker = (Socket)ar.AsyncState;
if (worker.EndReceive(ar) > 0)
{
var packet = new phPacket(m_buffer);
lock (m_packetQueue)
{
//Queue or process the packet.
}
worker.BeginReceive(m_buffer, 0, 8192, SocketFlags.None, new AsyncCallback(WaitForData), worker);
}
else //Connection Ended
{
m_isClosing = true;
if (m_ProxySocket.Connected)
{
m_ProxySocket.Shutdown(SocketShutdown.Both);
m_ProxySocket.Close();
}
m_ProxySocket = null;
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
}
}
}