read mit Timeout

Direkte Linux-Programmierung, POSIX
Antworten
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

read mit Timeout

Beitrag von Xin » Di Apr 19, 2011 9:42 am

U.a. für das proggen.org CMS schreibe ich einen Webserver. Der funktioniert auch schon und liefert einer Responderklasse brav seine HTTP-Parameter und Variablen, die per POST übertragen werden.
Also Formulare übertragen klappt inzwischen. :-)

Um die Anfrage aus dem Stream zu lesen, verwende ich die Linux-Funktion read().
Mein Problem ist, dass eine Anfrage an den Webserver dazu führt, dass dieser die Anfrage lesen muss und die read() Funktion solange wartet, bis das erwartete Zeichen kommt.

Wenn ein Angreifer nun eine halbe Anfrage schickt und mich dann sitzen lässt, wartet der Server...
Wenn das ein Bot-Netz macht, macht die Kiste die Grätsche.
Ich muss also in die Lage versetzt werden, das Warten abzubrechen. Dafür brauche ich ein Timeout, so dass ich festlege "Wer nach 10 Sekunden seine Anfrage nicht vollständig geschickt hat, hat Pech gehabt."

Kennt jemand spontan ein Read mit Timeout? Ich meine sowas schonmal gesehen zu haben, aber Google wirft mich mit anderen Sprachen zu.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nouseforname
Beiträge: 236
Registriert: Do Feb 10, 2011 6:31 pm

Re: read mit Timeout

Beitrag von nouseforname » Di Apr 19, 2011 10:46 am

Code: Alles auswählen

read -t TIMEOUT

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: read mit Timeout

Beitrag von cloidnerux » Di Apr 19, 2011 10:49 am

Pack es in nen Thread und wenn der sich nicht innerhalb von 10s beendet hat, fliegt er raus.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: read mit Timeout

Beitrag von Xin » Di Apr 19, 2011 10:50 am

nouseforname hat geschrieben:

Code: Alles auswählen

read -t TIMEOUT
:-)

Ich meinte die C-Routine. ^^

Code: Alles auswählen

man 2 read
Hier brauche ich eine Variante mit Timeout. Im Notfall muss ich den 'read'-Befehl auseinandernehmen und gucken, was der tut ^^

cloidnerux hat geschrieben:Pack es in nen Thread und wenn der sich nicht innerhalb von 10s beendet hat, fliegt er raus.
Das ist bisher auch meine Überlegung, da ich sowieso Threads verwenden will. Derzeit nutze ich fork(), was aber vielleicht aufwändiger als notwendig ist. Dann muss ich allerdings eine Verwaltung von abzuschießenden Threads aufmachen, was ich natürlich gerne verhindern würde.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nouseforname
Beiträge: 236
Registriert: Do Feb 10, 2011 6:31 pm

Re: read mit Timeout

Beitrag von nouseforname » Di Apr 19, 2011 12:41 pm

Xin hat geschrieben: Ich meinte die C-Routine. ^^

Code: Alles auswählen

man 2 read
Du sagtest Linux und read(), also pasts es :P

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: read mit Timeout

Beitrag von mfro » Mi Jan 16, 2013 7:40 pm

Xin hat geschrieben: Um die Anfrage aus dem Stream zu lesen, verwende ich die Linux-Funktion read().
Mein Problem ist, dass eine Anfrage an den Webserver dazu führt, dass dieser die Anfrage lesen muss und die read() Funktion solange wartet, bis das erwartete Zeichen kommt.
Du kannst mit select() vorher abfragen, ob Zeichen zur Verfügung stehen (bzw. ob ein read() blockieren würde).
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten