Почему мой поток ответов HttpListener внезапно зависает? - PullRequest
0 голосов
/ 17 июня 2020

Я создал веб-сервер в c# и провел атаку отказа в обслуживании, чтобы посмотреть, что произойдет. Примерно после 1000 запросов он зависает (хотя он работает через 50i sh секунд) при записи в поток ответа. Может кто-нибудь объяснить, почему это происходит? Вот код веб-сервера.

private static HttpListenerResponse SetResponse(string absolutePath, HttpListenerResponse current)
    {
        byte[] buffer;

        switch (absolutePath)
        {
            case "/":
                buffer = File.ReadAllBytes(docsFolder + "index.html");
                break;
            case var _ when absolutePath.Contains("/server_directory/"):
                buffer = File.ReadAllBytes(docsFolder + "/server_directory/403.html");
                current.StatusCode = (int)HttpStatusCode.Forbidden;
                break;
            case var _ when absolutePath.EndsWith("/"):
                var directoryIndex = GetDirectoryIndex(absolutePath);
                current.StatusCode = (int)directoryIndex.Value;
                buffer = directoryIndex.Key;
                break;
            case var _ when absolutePath == "/favicon.ico":
                buffer = File.ReadAllBytes(docsFolder + "/server_directory/favicon.ico");
                current.ContentType = "image/x-icon";
                break;
            case var _ when File.Exists(docsFolder + absolutePath):
                buffer = File.ReadAllBytes(docsFolder + absolutePath);
                break;
            default:
                if (!File.Exists(docsFolder + "/server_directory/404.html"))
                {
                    buffer = Encoding.UTF8.GetBytes("Error, 404 error page not found.");
                    current.StatusCode = (int)HttpStatusCode.NotFound;
                    break;
                }
                buffer = File.ReadAllBytes(docsFolder + "/server_directory/404.html");
                current.StatusCode = (int)HttpStatusCode.NotFound;
                break;
        }

        // Get a response stream and write the response to it.
        current.ContentLength64 = buffer.Length;
        Stream output = current.OutputStream;
        output.Write(buffer, 0, buffer.Length); // Freezes here
        output.Close();

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