Tag11 automatisch
› Forums › (Deutsch) User Projekte › Tag11 automatisch
Tagged: keep-alive
- This topic has 5 replies, 3 voices, and was last updated 8 years, 12 months ago by Klaus.
-
AuthorPosts
-
December 11, 2015 at 20:22 #809KlausParticipant
Ich bin bald am verzweifeln. Ich habe den Sketch von Tag11 mal etwas erweitert, so dass eine Antwort von ganz alleine generiert wird.
Teste ich den Sketch mit Firefox3, so funktioniert es auch fast einwandfrei. Fast, weil komischerweise in der Rückmeldung auf die Nachricht “Hallo…” noch ein “busy s…” dran hängt. Dann aber nächste Zeile SEND OK und die Antwort kommt ohne Probleme zurück zum Browser.
Nutze ich stattdessen einen aktuellen Opera, Chrome oder Safari, so werden 2 Verbindungen zum Modul aufgebaut. Auf der Verbindung 0 kommt wie gewohnt die Anfrage des Browsers, Verbindung 1 wird gleich wieder geschlossen. Mein Sketch sendet nun die Antwort wie gewohnt an Verbindung 0, Verbindung 1 wird ignoriert, da keine Anfrage rein kommt. Allerdings wird bei jeder Anfrage 2 Antworten generiert, wovon nur eine durch geht, bei der anderen kommt “Send Error”.
Vielleicht gibt es ja hier jemanden, der weiß, was die modernen Browser da komisches treiben.Attachments:
December 11, 2015 at 20:46 #812RaabinatorMemberHallo Klaus.
Aus deiner Funktion
espConnectionIP
gibst du einen Zeiger auf ein char-Array zurück, das nur in dieser Funktion gültig ist.
Dieses Array wird beim Aufruf der Funktion auf dem Stack angelegt. Wird die Funktion verlassen, wird dieser Speicher wieder für die Benutzung freigegeben. D.h. die Daten werden durch Daten der nächsten Funktion überschrieben. Das kann funktionieren, ist aber sehr unwahrscheinlich und unsicher.
Da gibt es zwei Möglichkeiten:- deklariere
tmp1
als static (static char tmp1[100];
). Damit wirdtmp1
global angelegt und nicht mehr überschrieben, ist aber weiterhin nur in dieser Funktion sichtbar. Der Inhalt bleibt zwischen den Funktionsaufrufen erhalten. - definiere
tmp1
global (vor allen Funktionen). tmp1 ist dann für alle Funktionen sichtbar, ausser fürloop()
, denn da gibt es nochmal ein lokalestmp1
.
- This reply was modified 9 years ago by Raabinator.
December 11, 2015 at 21:29 #814KlausParticipantIch hab das nur ausgelagert. Als ich es noch direkt in der loop() drin hatte, war das Ergebnis exakt das gleiche.
December 12, 2015 at 11:17 #821KlausParticipantLösung gefunden.
String tmp; tmp=sendCom(tmp);
hat dieses Phänomen erzeugt. sendCom gibt ein boolean zurück. Das wird nicht korrekt umgewandelt. Der alte Inhalt aus tmp bleibt erhalten, aber das Ende-Zeichen wird wohl überschrieben.
Offen bleibt die Frage, warum die Browser heutzutage eine zweite Verbindung öffnen, die sie gleich wieder schließen?
December 16, 2015 at 21:21 #899RoebiMemberHallo Klaus.
Ev. könnte
https://en.m.wikipedia.org/wiki/HTTP_persistent_connection#HTTP_1.1
https://en.m.wikipedia.org/wiki/HTTP_persistent_connection#Use_in_web_browsers
ein Grund sein, dass die moderneren Browser (HTTP 1.1) das Verhalten des Webservers auf die Fähigkeit mehrere Verbindungen zu öffnen prüfen.Gruss Röbi
December 17, 2015 at 10:38 #900KlausParticipantDanke, das hört sich nach einer plausiblen Erklärung an. Fragt sich nur, warum der Browser die Verbindung gleich wieder schließt? Der Server hat ja so gar keine Chance, mehrere Inhalte simultan zu übertragen.
-
AuthorPosts
- You must be logged in to reply to this topic.