Arduino-Webserver vor zu vielen Requests schützen

Hallo!

Ich hab ein Ethernet-Shield und bin grad dabei einen kleinen Webserver zu schreiben. Dieser soll später Relais ein- und ausschalten. Das funktioniert auch soweit, allerdings schmiert das Board ab wenn ich es zu viele Requests in zu kurzer Zeit erhält.
Es ist natürlich völlig ok, dass es nicht alle Requests beantworten kann, aber das es abschmiert und ohne Trennen vom Strom erstmal gar nichts mehr funktioniert stört mich.

Wie kann man dem sinnvoll entgegenwirken? Gibt es eine Möglichkeit, dass das Arduino einfach die Verbindung zu macht wenn es mit ihr nicht mehr klar kommt? Wie kann ich verhindern, dass das Arduino wegen zu vieler Requests abschmiert?

Hilft vielleicht ein delay() in der Schleife?

Nein leider nicht. Ich habe eher das Gefühl, dass irgendein Puffer voll läuft. Wenn ich einen Request sende blinkt die RX-Led auf dem Shield, der Request wird allerdings nicht beantwortet.

Wie sieht der request aus ? Wie lange ist er ?

Der besteht nur aus dem typische Firefox-Header. Ich sende keine Daten mit. Später will ich maximal 10 Zeichen via GET übergeben. Daran kann es also auch nicht liegen...

Es ist ja nur wenn das Board zu viele Requests bekommt... vielleicht wenn es mehr als 4 gleichzeitig sind... aber wo kann man regeln was passiert wenn dieser Fall auftritt?

Vielleicht, indem Du nach Empfang von 1-2 requests -vorübergehend- nicht mehr an Port 80 lauschen lässt - dann gingen weitere requests erstmal ins Leere.

Das ist eine einfache aber gute Idee. Das werde ich mal probieren.

Oder alternativ die gerade aufgebaute TCP-Verbindung einfach wieder disconnecten - das wäre noch einfacher. :wink:

Klappt leider nicht. Ändert nichts am Problem. Ich zähle die Verbindungen und wenn es mehr als zwei (habs auch mit nur einer probiert) sind rufe ich sofort client.stop(); auf. Aber leider bleibt der Server trotzdem hängen, wenn ich z.B. mal cmd+r gedrückt halte und den Server mit Requests flute.

Und irgendwie scheint es auch nicht möglich zu sein, den Server nicht mehr an Port 80 lauschen zu lassen. Es gibt nur server.begin(..), aber kein stop oder so. Das gibts irgendwie nur in der Client-Klasse...

Meine Standardlösung für sowas wäre keinen Arduino für sowas zu nehmen. Ich würde stattdessen einen geeigneten Router mit WRT flashen oder was ähnlichem und diesen stattdessen verwenden. Mit Gehäuse + Netzteil ist ein Router auch nicht teurer und die Dinger haben gleich sehr viel mehr Rechenleistung. Ein Router hat naturgemäß sehr viel weniger Probleme mit Netzwerklast als so ein armer kleiner Arduino.

So viel will ich ja eigentlich gar nicht machen.

Ich hab es jetzt auch soweit hinbekommen, dass er alle Requests annimmt und zumindest den HTTP-Header + einen kleinen HTML-Body sendet. Scheinbar scheint es problematisch gewesen zu sein, dass ich client.print() statt client.write() benutzt habe. Bei write() wird das ganze ja sofort geflusht oder? Nutze ich print() scheint da etwas durcheinander zu kommen. Gemerkt habe ich das daran, dass bei einem Response plötzlich mehrere Header + Daten zusammengefasst waren (also die Antworten auf verschiedene Requests in nur einem Response).