构建一个C#异步TCP代理服务器

Cri*_*lin 0 c# proxy tcp asyncsocket

我正在尝试为我的企业构建一个简单的C#TCP代理,这样我就可以阻止员工访问某些网站.一切都很顺利,除了我无法看到用户试图访问的网站...我可以看到用户已经连接到我的代理服务器所以我知道我正在获得连接,但OnRecieve回调甚至没有解雇.我从插座读错了吗?

这是我的代码:

internal class AsyncState
{
    public const int BufferSize = 4096;
    public byte[] Buffer = new byte[AsyncState.BufferSize];
    public Socket Socket;
    public StringBuilder Content = new StringBuilder();
}

private void OnLoad(object sender, EventArgs e)
{
    IPAddress[] addressCollection = Dns.GetHostAddresses(Dns.GetHostName());
    foreach (IPAddress ipAddress in addressCollection)
    {
        if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
        {
            localEndPoint = new IPEndPoint(ipAddress, 8080);
            Console.WriteLine("Local IP address found... " + localEndPoint.ToString());
            break;
        }
    }

    isListening = true;

    thread = new Thread(new ThreadStart(
        delegate()
        {
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(localEndPoint);
            serverSocket.Listen(10);

            while (isListening)
            {
                resetEvent.Reset();

                Console.WriteLine("Waiting for clients...");
                serverSocket.BeginAccept(new AsyncCallback(OnAccept), serverSocket);

                resetEvent.WaitOne();
                }
            }));

        thread.Start();
    }
}

private void OnAccept(IAsyncResult result)
{
    resetEvent.Set();

    Socket clientSocket = (result.AsyncState as Socket).EndAccept(result);
    Console.WriteLine("Client has connected... " + clientSocket.RemoteEndPoint.ToString());

    AsyncState state = new AsyncState();
    state.Socket = clientSocket;
    state.Socket.BeginReceive(state.Buffer, 0, AsyncState.BufferSize, SocketFlags.None, new AsyncCallback(OnRecieve), state);
}

private void OnRecieve(IAsyncResult result)
{
    AsyncState state = result.AsyncState as AsyncState;

    int totalRead = state.Socket.EndReceive(result);
    if (totalRead > 0)
    {
        state.Content.Append(Encoding.ASCII.GetString(state.Buffer, 0, totalRead));
        state.Socket.BeginReceive(state.Buffer, 0, AsyncState.BufferSize, SocketFlags.None, new AsyncCallback(OnRecieve), state);
    }
    else
    {
        if (state.Content.Length > 1)
            Console.WriteLine("Message recieved from client... " + state.Content.ToString());

        state.Socket.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

Yah*_*hia 5

构建一个运行良好的代理并不是一项简单的任务,因为您必须在两个方向上理解和处理HTTP等...

我建议使用现有的库或一些可配置的代理...

备注:

我不知道你在哪个司法管辖区,但在没有员工知情/同意的情况下使用这种技术在某些地方可能会成为一个问题......

另一点:我不会使用这些方法,而是告诉员工停止滥用公司的互联网连接1-3次,如果这不起作用,我宁愿解雇那个人......这样的员工不仅滥用互联网公司的联系,但在最坏的情况下,公司面临风险(病毒/木马等),并欺骗公司(如果他在工作时间这样做)...