Tag11 automatisch
› Foren › User Projekte › Tag11 automatisch
Schlagwörter: keep-alive
- Dieses Thema hat 5 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 8 Jahren, 12 Monaten von Klaus.
-
AutorBeiträge
-
Dezember 11, 2015 um 20:22 Uhr #809KlausTeilnehmer
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:
Dezember 11, 2015 um 20:46 Uhr #812RaabinatorMitgliedHallo 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
.
- Diese Antwort wurde geändert vor 9 Jahren von Raabinator.
Dezember 11, 2015 um 21:29 Uhr #814KlausTeilnehmerIch hab das nur ausgelagert. Als ich es noch direkt in der loop() drin hatte, war das Ergebnis exakt das gleiche.
Dezember 12, 2015 um 11:17 Uhr #821KlausTeilnehmerLö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?
Dezember 16, 2015 um 21:21 Uhr #899RoebiMitgliedHallo 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
Dezember 17, 2015 um 10:38 Uhr #900KlausTeilnehmerDanke, 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.
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.