построение асинхронного прокси-сервера TCP на C # - PullRequest
0 голосов
/ 07 ноября 2011

Я пытаюсь создать простой прокси-сервер 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();
    }
}

1 Ответ

5 голосов
/ 07 ноября 2011

Создание хорошо работающего прокси-сервера не простая задача, так как вам придется понимать и обрабатывать HTTP и т. Д. В обоих направлениях ...

Я бы порекомендовал использовать для этого либо существующую библиотеку ИЛИ какой-нибудь настраиваемый прокси...

ЗАМЕЧАНИЕ:

Я не знаю, в какой юрисдикции вы находитесь, но используете такую ​​технологию без ведома/ согласие сотрудников в некоторых местах может быть проблемой ...

Еще один момент: вместо того, чтобы использовать такие методы, я бы сказал сотруднику прекратить злоупотребление интернет-соединением компании 1-3 раза, и если это не такне работаю, я бы предпочел уволить этого человека ... такие сотрудники не только злоупотребляют интернет-соединением компании, но в худшем случае подвергают компанию риску (вирус / троян и т. д.), а также обманывают компанию (если он это делаетв рабочее время) ...

...