Сокеты Async Server действуют очень странно - PullRequest
1 голос
/ 26 февраля 2012

Я работаю над простым отладочным прокси-сервером. Кажется, все работает нормально, за исключением того, что 70% запросов фактически обрабатываются, а в остальных я получаю странные данные.

У меня есть 3 функции:

    private static void Listen(Object obj)
    {
        log("**** Listen()");
        TcpListener listener = (TcpListener)obj;
        try
        {
            while (true)
            {
                TcpClient client = listener.AcceptTcpClient();
                while (!ThreadPool.QueueUserWorkItem(new WaitCallback(ProxyServer2.ProcessClient), client)) ;
            }
        }
        catch (ThreadAbortException) { MessageBox.Show("ABORT EX"); }
        catch (SocketException) { MessageBox.Show("SOCKET EX"); }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }

    private static void ProcessClient(Object obj)
    {

        log("**** ProcessClient");
        TcpClient client = (TcpClient)obj;
        try
        {
            DoHttpProcessing(client);
        }
        catch (Exception ex)
        {
            log(ex.Message);
        }
        finally
        {
            client.Close();
        }
    }

    private static void DoHttpProcessing(TcpClient client)
    {
        log("**** DoHttpProcessing");
        // handle all the http stuff
    }

Здесь начинается странная часть. Когда я делаю запрос через прокси, запрос выполняется и возвращается, когда я делаю это во второй раз, я получаю последние 10-30 байт, возвращенные из предыдущего запроса.

Самое странное, что когда я получаю эти байты мусора, DoHttpProcessing НЕ запускается (что не имеет смысла, так как содержит потоки, которые отправляют ответ браузеру). Что-то отправляет обратно мусорные данные ... но что?

Похоже, что браузер пытается получить новый запрос, используя то же старое соединение? Это возможно?

После запуска DoHttpProcessing все потоки закрываются, поэтому я не понимаю, как сервер может использовать старое соединение и получить эти данные мусора!?!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...