Forum: Mikrocontroller und Digitale Elektronik LwIP TCP Server korrekt abschliessen


von Albert F. (Gast)


Lesenswert?

Moin zusammen,

Seit ein paar Wochen spiele ich mit LwIP und STM32F7 relativ 
erfolgreich, so dass ich ein paar MBps schicken kann.

Ich habe ein TCP Server, der im Prinzip auf eine Verbindung wartet um 
Daten zum Client zu schicken, bis der Client weg ist. Das heisst 
theoretisch, wenn sich ein Client zum Server verbindet, schickt der 
Server Daten fuer immer.

Wenn der Client weg ist, versuche ich alle Callbacks und pointer zu 
resetten, und den tcp_pcb wieder auf "Listening" zu stellen. 
Komisherweise, bei tcp_bind bekomme ich den ERR_USE Fehler (obwohl ich 
alles abgeschlossen habe). Dazu kommt noch dass nach den Bind Fehler, 
der Client sich trotzdem verbinden kann, und alles wie frueher laeuft.

Letztens, wenn ich einen zweiten Client oeffnen moechte, wird die 
Verbindung akzeptiert und der Mikro stirbt sofort.

Die Frage nun, wie kann ich sicherstellen dass alle pcbs und Callbacks 
wirklich abgeschlossen sind und deb Server wirklich von neu starten?

Cheers,

Albert

von 458iu7888766687 (Gast)


Lesenswert?

ein paar zeilen mehr info sind gut ...


Ich leiste mir zB den overhead der sockets ...
dadurch wird das ganze zwar größer aber ich habe mit dem management 
nicht viel am hut.
das macht der stack für mich.
Ps: habe auch STM32F7 aber mit RTOS
und im normalbetrieb um 10-12 sockets offen


welche API verwendest du also?
socket?netconn?RAW?

von 458iu7888766687 (Gast)


Lesenswert?

PS:

wenn du einen port aufmachst ...
musst du dafür sorgen das du mehrere clients unterstützt...

also entsprechend weiter lauschen und verbindungen akzeptieren.
die meisten beispiele im netz erlauben genau eine einzige verbindung...

die ganzen states der einzelnen verbindung musst du dir dann selbst 
zwischenspeichern.

von Albert F. (Gast)


Lesenswert?

Hi,

Diese Applikation soll nur einen Client unterstuetzen. Ich habe die TCP 
RAW API als single Thread am Laufen.

Naechster Schritt wird das ganze mit dem RTOS ausprobieren.

Zumindest habe ich es geschafft den Mikro nicht zu toeten wenn sich 
jemand anders verbinden moechte.

Cheers,

Albert

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Uhm, der Kontrollfluss so wie Du ihn schilderst ist etwas overkill. 
Normalerweise sieht es so aus:

Du lässt den Original socket in "listening." Deine Hauptschleife setzt 
ein accept() ab. Dadurch wird der Originalsocket geklont und über den 
Klon die Kommunikation abgewickelt. Wenn der Klon fertig ist mit 
kommunizieren, wird er mit close() aufgeräumt und wieder zum accept() 
zurückgesprungen. Der Originalsocket wird bei keinem Web Server nochmal 
angerührt, der bleibt so wie er ist. Je nach Kontrollfluss und 
Ressourven im uC kannst Du ja auch beliebig viele Klone gleichzeitig 
offen haben (one thread per client,thread pools, completion ports etc). 
Warum willst Du einen PCB nach "listening" zurücksetzen? Das gibt es in 
diesem normalen Kontrollfluss gar nicht...

Allerdings gibt es bei der "sequentiellen Clientabarbeitung" eine Reihe 
von Fallstricken. Wenn z.B. ein HTTP Request den Server in Limbo lässt, 
wird kein neuer mehr durchkommen, was auch heisst, dass eine 
Denial-of-Service Attacke deinen Web Server zuverlässig lahmlegen kann. 
Du musst also sicherstellen, dass jeder request in einer definierten 
Maximalzeit fertig ist (also mit Timeouts schaffen). Dazu kommt, dass 
manche Browser hinter den Kulissen mehrere requests absetzen, sich also 
in der Warteschlange mehrere Requests ansammeln, während dein Server 
noch den Einen abarbeitet. Für den Benutzer am Browser kann das heissen, 
dass er sehr lange auf einen Seitenaufbau warten muss. Denk daran, dass 
HTTP stateless ist, also pro HTTP request genau ein Element ausgetauscht 
wird, und das kann bei einer Website eine beliebig grosse Menge 
einzelner requests sein.

Good luck!

von Albert F. (Gast)


Lesenswert?

Hi Ruediger,

Danke fuer die Antwort, das mit dem Listening werde ich versuchen, das 
hoert sich sehr plausibel an.

Dieser Server ist ein Custom-Server, der nur ein einziges Client 
akzeptiert, und da darf auch kein anderer dran. Es geht im Prinzip um 
konstante Datenuebertragung zwischen zwei Geraete, und das wars!

Cheers,

Alberto

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.