Я создал веб-сервер в 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;
}