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
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?
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.
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.