LwIP TCP Server korrekt abschliessen

Gast #5106239
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
Gast #5106330
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?
Gast #5106336
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.
Gast #5106494
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
(Firma: keine) #5106532
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!
Gast #5107351
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.