Http Server event-stream Sitzung halten

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
darkwin
Beiträge: 26
Registriert: So Aug 08, 2021 4:37 pm

Http Server event-stream Sitzung halten

Beitrag von darkwin » So Okt 03, 2021 3:09 pm

Hallo, ich habe mir ein C Buch gekauft und dort war ein Beispiel wie man einen kleinen Webserver erstellt.
Ich bin nun soweit das der Webserver auf Port 8000 eine Seite ausliefert.
Der ausgelieferte Code fragt anschließend am Webserver die Seite "document.URL" an und bekommt eine Nachricht ausgeliefert die dann in einer Textbox aufgefüllt wird.

Den C Code und die Webseite hänge ich an.

Zur Zeit bleibt der Code bei dieser Zeile:

Code: Alles auswählen

client_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &addr_size);
solange stehen bis ein Client eine Anfrage stellt.
Bei einer Anfrage wird der Prozess geforkt die Seite ausgeliefert und die Verbindung zum Client getrennt.

Da es ein event-stream ist fragt der Browser auch nach einem Verbindungsverlust automatisch neu am Server an, also ca. alle 5 Sekunden.
Deshalb wird meine Textbox auch laufend weiter gefüllt.

Das ist aber gar nicht das was ich will.
Ich möchte das die Clientverbindung gehalten wird damit mein Programm wenn es neue Informationen hat dem Client neue Daten schicken kann.

So nun zu meinen Fragen.

1. soll mein Programm nicht nur auf Clientanfragen warten sondern auch noch anderen Code ausführen.
2. Wie mache ich das mit dem Client Management?
Also wie kann ich z.b. von meinem Programm aus auf den bzw. die Kind-Prozess(e) zugreifen?
Dann muss sicher auch noch eine Abfrage in die Daten senden Funktion das wenn der Kind-Prozess den Webclient nicht mehr erreicht die Verbindung beendet wird.
3. Wenn es mehr als ein Kind-Prozess gibt müssen die Daten ja an alle vorhandenen Kind Prozesse gesendet werden.

Hat jemand eine Idee wie das geht?

Also Punkt 1 habe ich gerade schon gelöst.
Mit diesen beiden Code Zeilen läuft der Prozess nicht Blockierend weiter und ich kann noch anderen Code ausführen.

Code: Alles auswählen

  flags = fcntl(sock_fd, F_GETFL);
  fcntl(sock_fd,F_SETFL, flags | O_NONBLOCK);
Da ich die Webseite nicht anhängen kann hier im Codeblock

Code: Alles auswählen

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Whirlpool</title>
</head>
<body>
<script>
var siteEvent1  =
 '<BODY bgcolor="#FFFF99" text="#000000">\
  <FONT size="6" FACE="Verdana">EventStream</FONT>\
  <HR>\
  <BR>Messages:<BR>\
  <textarea id="msg" rows="5" cols="30"></textarea><BR>\
  <BR>Values A0:<BR>\
  <input type="range" id="a0" name="a0" max="1023" value="0"><BR>\
  <HR>\
';

document.write(siteEvent1  );

var source = new EventSource("document.URL");

source.addEventListener('a0', function(e) {
  document.getElementById("a0").value = e.data;
}, false);
source.addEventListener('msg', function(e) {
  document.getElementById("msg").value += e.data + "\n";
}, false);
</script>
</body>
</html>
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

nufan
Wiki-Moderator
Beiträge: 2540
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Http Server event-stream Sitzung halten

Beitrag von nufan » So Okt 10, 2021 12:21 pm

darkwin hat geschrieben:
So Okt 03, 2021 3:09 pm
Ich möchte das die Clientverbindung gehalten wird damit mein Programm wenn es neue Informationen hat dem Client neue Daten schicken kann.
Ich sehe zwei passende Möglichkeiten das umzusetzen:
1) Long Polling: https://javascript.info/long-polling
2) WebSockets: https://developer.mozilla.org/en-US/doc ... ockets_API

Beides muss allerdings serverseitig unterstützt werden. Ich vermute Option 1) ist in einem minimalen Server einfacher zu implementieren.
darkwin hat geschrieben:
So Okt 03, 2021 3:09 pm
2. Wie mache ich das mit dem Client Management?
Also wie kann ich z.b. von meinem Programm aus auf den bzw. die Kind-Prozess(e) zugreifen?
Dann muss sicher auch noch eine Abfrage in die Daten senden Funktion das wenn der Kind-Prozess den Webclient nicht mehr erreicht die Verbindung beendet wird.
3. Wenn es mehr als ein Kind-Prozess gibt müssen die Daten ja an alle vorhandenen Kind Prozesse gesendet werden.
Das Stichwort für diese Fragen ist "Pipe" :)
https://openbook.rheinwerk-verlag.de/li ... 09-002.htm
Damit kannst du Daten zwischen den Prozessen austauschen. Mehrere Kinder sind kein Problem, du brauchst aber für jedes Kind eine eigene Pipe.

darkwin
Beiträge: 26
Registriert: So Aug 08, 2021 4:37 pm

Re: Http Server event-stream Sitzung halten

Beitrag von darkwin » Mi Okt 13, 2021 7:36 am

Danke für die Tipps, Pipe klingt gut.
Zu Websockets habe ich gerade ein C Beispiel gefunden.
Ich versuche es umzusetzen.

Antworten