SharpWebserver

    • Beta
    • Open Source

    Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von φConst.

      SharpWebserver

      Beschreibung
      Die Applikation ist ein Web-Server basierend auf TCP/Ip und erlaubt den Zugriff über einen Browser auf einen spezifischen Ordner.
      Es unterstützt PHP und (pseudo) DDoS-Handling.

      Es wurde in C# entwickelt... ihr benötigt mindestens .NET Framework 4.6 ( ihr könnt diese auch auf 4.5 setzen, siehe Source.zip).

      Screenshots
      (Siehe Anhang)

      OpenSource
      Der Code ist ostensiv; dass Dekompilieren ist permittiert.
      Source, siehe Anhang.


      Bilder
      • 1.png

        7,82 kB, 800×500, 456 mal angesehen
      • 2.png

        9,41 kB, 800×500, 428 mal angesehen
      • 3.png

        23,49 kB, 800×500, 417 mal angesehen
      • 4.png

        5,42 kB, 1.920×210, 445 mal angesehen
      • 5.png

        18,74 kB, 800×500, 440 mal angesehen
      Dateien
      • source.zip

        (327,28 kB, 255 mal heruntergeladen, zuletzt: )
      Und Gott alleine weiß alles am allerbesten und besser.

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „φConst“ ()

      Nein. Einfach ein ganz normales Design, wo nicht 5 Grautöne vorkommen. ;)
      In a nutshell: Nimm' die Standard-Controls so wie sie sind.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Nächstes Update wird dies _ dann umgesetzt, danke...

      Kleine Anmerkung: Die Source.zip Datei lädt beim Debuggen die Datei gfdimage.esy.es/Config.zip runter.
      Diese ist notwendig, um die Applikation zu starten.
      Und Gott alleine weiß alles am allerbesten und besser.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „φConst“ ()

      Achtung: Habe festgestellt das die Applikation ein extremes Speicher-Lack hat.
      Dateien werden zwar mehr oder minder richtig repräsentiert, der GC gibt jedoch spät Speicher frei.

      Wenn ich den GC "forciere" Speicher freizugeben, schießt die CPU Last hoch... nächstes Update wird also die Kompromiss-Findung zu diesem Problems sein und die Prävention der Nutzung der Methode

      C#-Quellcode

      1. Webserver.FreeMemory(2)


      C#-Quellcode

      1. public static void FreeMemory(int _s)
      2. {
      3. Console.ForegroundColor = ConsoleColor.Red;
      4. Console.WriteLine("[*] FREEING RAM (GC COLLECTING NOW 2 " + _s + " SECONDS)");
      5. Console.WriteLine("[*] THIS WILL CAUSE AN INCREASED CPU-USAGE!");
      6. int _amount = 0;
      7. ___GarbageCollectorCall = new Thread(new ThreadStart(() =>
      8. {
      9. Stopwatch _Timer = new Stopwatch();
      10. _Timer.Start();
      11. while (KeepListening)
      12. {
      13. if (_Timer.Elapsed.TotalMilliseconds > 1000)
      14. {
      15. //DO
      16. _amount++;
      17. _Timer.Reset();
      18. _Timer.Start();
      19. GC.Collect();
      20. }
      21. if (_amount == _s)
      22. break;
      23. }
      24. ___GarbageCollectorCall.Abort();
      25. }));
      26. ___GarbageCollectorCall.Start();
      27. }
      Bilder
      • Screenshot (683).png

        29,76 kB, 948×543, 356 mal angesehen
      Und Gott alleine weiß alles am allerbesten und besser.
      Hallo,
      die 2GB sind dadurch zustande gekommen, dass ich versucht habe eine zwei Gigabyte große Datei anzuzeigen.

      Der GC hat jedoch - warum auch immer - nicht Speicher freigegeben.
      Und Gott alleine weiß alles am allerbesten und besser.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „φConst“ ()

      Wenn eine Datei angefordert wird:

      C#-Quellcode

      1. using (var _file = MemoryMappedFile.CreateFromFile(_Uri))
      2. {
      3. Stream _requestFileStream = _file.CreateViewStream();
      4. using (var _memoryStream = new MemoryStream())
      5. {
      6. Console.ForegroundColor = ConsoleColor.Red;
      7. Console.WriteLine("[*] SERVER: USING MEMORYMAPPEDSTREAM");
      8. _requestFileStream.CopyTo(_memoryStream);
      9. __RequestedDataBuffer = _memoryStream.ToArray();
      10. _memoryStream.Close();
      11. _requestFileStream.Close();
      12. _file.Dispose();
      13. }
      14. }
      15. Webserver.FreeMemory(2); // Dangerous



      und am Ende jeder Anfrage:

      C#-Quellcode

      1. public void EndResponse()
      2. {
      3. WebClient.Close();
      4. StreamReader.Close();
      5. StreamWriter.Close();
      6. BinaryWriter.Close();
      7. StreamReader.Dispose();
      8. StreamWriter.Dispose();
      9. BinaryWriter.Dispose();
      10. __RequestedDataBuffer = new byte[0];
      11. __RequestedDataPath = "";
      12. ServerHeader = null;
      13. Console.WriteLine("[*] Server: DONE!");
      14. }


      Ich hab die Source zur Verfügung gestellt... ich löse es mit Streams, wie denn sonst?
      Und Gott alleine weiß alles am allerbesten und besser.
      Oh, dann wusste ich das bisher noch nicht und das müsste dann auch nicht unbedingt ein Problem sein. Auf jeden Fall ist das ​MemoryStream.ToArray() definitiv fehl am Platz - ich weiß sowieso nicht, wieso du die Daten der Datei unbedingt als Byte-Array brauchst.
      Eventualiter wird bei ToArray() alles ex abrupto kopiert... ich schreibe gleich mal eine Extension die dies um-modifiziert und "chunkweise" in ein Array kopiert.

      nafets schrieb:

      wieso du die Daten der Datei unbedingt als Byte-Array brauchst.

      Na, weil

      C#-Quellcode

      1. private void Send(byte[] _buffer)
      2. {
      3. Webserver.__Handler.InvokeAnonymous(delegate
      4. {
      5. Webserver.__Handler.serverStatus.Text = "WORKING...";
      6. Webserver.__Handler.serverStatus.Image = new Bitmap("configuration/etc/icons/orange.png");
      7. });
      8. try
      9. {
      10. Webserver.__Handler.InvokeAnonymous(delegate
      11. {
      12. Webserver.__Handler.logLB.Items.Add("[*] SENDING_FILE(LENGTH): " + _buffer.Length);
      13. Webserver.__Handler.logLB.TopIndex = Webserver.__Handler.logLB.Items.Count - 1;
      14. });
      15. BinaryWriter.Write(_buffer);
      16. BinaryWriter.Flush();
      17. Console.ForegroundColor = ConsoleColor.Green;
      18. Console.WriteLine("[*] Server: SENT_FILE");
      19. }
      20. catch
      21. {
      22. Webserver.__Handler.InvokeAnonymous(delegate
      23. {
      24. Webserver.__Handler.serverStatus.Text = "ERROR...";
      25. Webserver.__Handler.serverStatus.Image = new Bitmap("configuration/etc/icons/red.png");
      26. });
      27. Console.ForegroundColor = ConsoleColor.Red;
      28. Console.WriteLine("[*] Server: ERROR");
      29. return;
      30. }
      31. Webserver.__Handler.InvokeAnonymous(delegate
      32. {
      33. Webserver.__Handler.serverStatus.Text = "Ready";
      34. Webserver.__Handler.serverStatus.Image = new Bitmap("configuration/etc/icons/green.png");
      35. });
      36. }
      Und Gott alleine weiß alles am allerbesten und besser.
      Du musst halt wie ThuCommix gesagt hat in Chunks senden.

      Übrigens hast du allein in diesem Stück Code 3 Memory Leaks, da du immer wieder neue Bitmaps erstellst, ohne die alten zu disposen.
      CopyTo kopiert den kompletten Stream in den Ziel Stream(Mit einem internen Buffer). Aber da du hier in einen MemoryStream kopierst(Wie der Name schon sagt sind die Daten im RAM) könntest du auch gleich File.ReadAllBytes nutzen.
      Eine mögliche Lösung wäre den File Stream direkt der Send Funktion zu übergeben und statt BinaryWriter.Write(_buffer); machste stream.CopyTo(BinaryWriter.BaseStream);.