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);
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);
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>